【问题标题】:git --git-dir not working as expectedgit --git-dir 没有按预期工作
【发布时间】:2010-11-26 01:21:32
【问题描述】:

我正在尝试从与我所在的目录不同的目录运行 git。例如,如果我在:

cd /home/domain/
git status << runs perfect ie
# On branch master
# Your branch is ahead of 'origin/master' by 6 commits.

所以现在我想使用 --git-dir 选项从不同的目录运行此命令。

假设我在root/ 并试试这个:

git --git-dir="/home/domain/" status
## Error 
fatal: Not a git repository: '/home/domain/'

我也尝试包含 .git 文件夹,即

git --git-dir="/home/domain/.git/" status

但这看起来像是试图从根目录运行 git,即从我的域文件夹中删除所有内容并将所有内容添加到根目录中。

希望有人可以就我做错了什么提出建议。

【问题讨论】:

  • 现在我的状态很完美,但是 pull 给出了错误。即root@erx [/]# git --git-dir=/home/domain/.git --work-tree=/home/domain/ pull origin master fatal: /usr/local/libexec/git-core/git -pull 不能在没有工作树的情况下使用。但是状态有效??任何想法乔恩
  • 这是 git 目前最大的 bug。不尊重 --work-tree 和/或 --git-dir 参数。
  • 从 git 1.8.5 开始,你可以选择not设置--git-dir--work-tree 一个简单的命令:见my answer below

标签: git


【解决方案1】:

您还必须定义工作目录。我知道这很令人困惑,但这是一种灵活性。

git --git-dir=/mycode/.git --work-tree=/mycode status

您可以阅读更多here

【讨论】:

  • 感谢这工作!同意这是令人困惑的。它被称为保持简单愚蠢。您几乎总是可以允许灵活性,同时提供最有意义的默认值 VS 让命令根本不起作用。
  • @Nick 同意,你会认为如果没有指定 --git-dir,它会检查 /mycode/.git 是否存在并在抛出错误之前使用它。
  • @NickYeates 附议!我在使用 ~ 来引用我的主目录时也遇到了问题,例如 git --git-dir=~/src/s3cmd/.git --work-tree=~/src/s3cmd pull 不起作用但 git --git-dir=/home/username/src/s3cmd/.git --work-tree=/home/username/src/s3cmd pull 起作用
  • 请注意,并非所有命令都需要工作树,例如,“git --git-dir=/mycode/.git log”可以正常工作。同意这令人困惑!
  • 小澄清:git --git-dir="$HOME/foo/.git" --work-tree="$HOME/foo" status
【解决方案2】:

git 1.8.5开始(下周应该会出),会更简单:

 git -C "/home/domain/" status

不再需要设置--git-dir--work-tree

但是,正如OmarLthe comments 中所指出的:

我发现-C 并不完全等同于--git-dir --work-tree,因为-C 不会覆盖GIT_DIR 环境变量


请参阅 Nazri Ramliycommit 44e1e4

在不离开当前目录的情况下,在不同的目录中调用 git 命令需要更多的按键:

  1. (cd ~/foo &amp;&amp; git status) git --git-dir=~/foo/.git --work-tree=~/foo status GIT_DIR=~/foo/.git GIT_WORK_TREE=~/foo git status
  2. (cd ../..; git grep foo)
  3. for d in d1 d2 d3; do (cd $d &amp;&amp; git svn rebase); done

上面显示的方法对于脚本来说是可以接受的,但对于快速命令行调用来说太麻烦了。

使用这个新选项,可以用更少的按键完成上述操作:

  1. git -C ~/foo status
  2. git -C ../.. grep foo
  3. for d in d1 d2 d3; do git -C $d svn rebase; done

【讨论】:

  • 我在 git 命令之后尝试使用 -C 标志时被绊倒了(例如,git status -C &lt;path&gt; 不起作用!)
  • @OmarL 好点,谢谢。我已将您的评论包含在答案中以提高知名度。
【解决方案3】:

根据您上面的评论,听起来您仍然遇到问题:

root@erx [/]# git --git-dir=/home/domain/.git --work-tree=/home/domain/ pull origin master 致命:没有工作树就不能使用 /usr/local/libexec/git-core/git-pull

听起来您可能打算从crontab 或其他地方运行它。您最好先使用cd 切换到您的工作目录。例如:

root@erx [/]# (cd /home/domain && git pull origin master)

这将暂时(在子shell中,这是括号所做的)将当前目录更改为/home/domain,然后运行git pull origin master。命令完成后,您的当前目录将保持在命令之前的状态。

【讨论】:

  • 使用子shell 简单而优雅。我不知道为什么我以前没有想到这一点!
  • 抱歉@Greg,在回答所问问题时,Jon 对另一个答案投了赞成票 - 但我认为你发现并回答了意图和你的洞察力,即 ()s,正是我在寻找什么 +10
【解决方案4】:
git --git-dir="/home/domain/" status
## Error 
fatal: Not a git repository: '/home/domain/'

使用 Git 2.26(2020 年第一季度),文档更加清晰。

指定GIT_DIR 的位置(使用环境变量或使用“git --git-dir=&lt;where&gt; cmd”选项)的一个效果是禁用存储库发现

这在文档中被赋予了更多的压力,因为新用户经常会感到困惑。

参见Heba Waly (HebaWaly)commit d82ad54(2020 年 1 月 30 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit 17e4a1b,2020 年 2 月 12 日)

git: 更新 --git-dir 的文档

签字人:Heba Waly
协助人:Junio C Hamano

git --git-dir &lt;path&gt; 有点令人困惑,有时并不能像用户期望的那样工作。

例如,如果用户运行git --git-dir=&lt;path&gt; status,除非另有说明,否则 git 将跳过存储库发现算法并将工作树分配给用户当前的工作目录。
当这个赋值错误时,输出将不符合用户的期望。

此补丁更新了文档以使其更清晰。

所以documentation for git --git-dir 现在包括:

--git-dir=<path>:

设置存储库的路径(“.git”目录)。
这也可以通过设置GIT_DIR 环境变量来控制。
它可以是当前工作目录的绝对路径或相对路径。

使用此选项(或GIT_DIR 环境变量)指定“.git”目录的位置会关闭尝试查找具有“.git”子目录的目录的存储库发现(这是如何发现存储库和工作树的顶层的),并告诉 Git 您位于工作树的顶层。

如果你不在工作树的顶层目录,你应该告诉 Git 工作树的顶层在哪里,使用 --work-tree=&lt;path&gt; 选项(或 GIT_WORK_TREE 环境变量)

【讨论】:

    猜你喜欢
    • 2018-01-15
    • 2014-07-25
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 2014-10-15
    • 1970-01-01
    • 2013-09-17
    相关资源
    最近更新 更多