git --git-dir不能按预期工作


209

我正在尝试从与所在目录不同的目录运行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,即从我的域文件夹中删除所有内容,然后在root中添加所有内容。

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


4
现在我的工作状态很完美,但是pull却给出了错误。即root @ erx [/]#git --git-dir = / home / domain / .git --work-tree = / home / domain / pull origin master fatal:/ usr / local / libexec / git-core / git如果没有可用的树,则不能使用-pull。但是状态有效吗?任何想法乔恩

4
这是git中最大的错误。不遵守--work-tree和/或--git-dir参数。
亚当·迪米特鲁克

5
从git 1.8.5开始,您可以选择设置,--git-dir--work-tree使用一个简单的命令:请参阅下面的答案
VonC

Answers:


314

您还必须定义工作目录。我知道令人困惑,但这是灵活的事情。

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

您可以在这里阅读更多内容


3
谢谢你的工作!同意这令人困惑。它叫保持简单愚蠢。您几乎总是可以允许灵活性,同时提供默认值,这使VS拥有命令完全无效。
2012年

3
@Nick同意,您认为如果--git-dir未指定,它将检查是否/mycode/.git存在并在抛出错误之前使用它。
GP89 ​​2012年

4
@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确实起作用了
Jamie Cook

1
请注意,并非所有命令都需要工作树,例如,“ git --git-dir = / mycode / .git log”可以正常工作。同意这虽然令人困惑!
yoyo 2013年

4
几乎没有澄清: git --git-dir="$HOME/foo/.git" --work-tree="$HOME/foo" status
Haris Krajina 2014年

136

git 1.8.5开始(应该在下周发布),它将更加简单:

 git -C "/home/domain/" status

无需设置--git-dir--work-tree了!


提交44e1e4纳兹里Ramliy

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

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-dir=~/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 && 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

4
我在git命令尝试使用-C标志而跳闸(例如,git status -C <path>将无法工作!)
Kedar Paranjape

42

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

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原始主机)

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


使用子外壳既简单又优雅。我不知道为什么我以前没有想到这一点!
Ehtesh Choudhury

抱歉@Greg,在回答了所提问题时,乔恩(Jon)对其他答案投了赞成票-但我认为您可以发现并回答意图和您的见解,即()就是我一直在寻找的+10
Darren Bishop 2012年

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

使用Git 2.26(Q1 2020),文档更加清晰。

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

由于新用户经常会感到困惑,因此在文档中增加了一些压力。

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

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

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

git --git-dir <path> 有点混乱,有时无法按用户期望的那样工作。

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

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

因此,目前的文档git --git-dir包括:

--git-dir=<path>:

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

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

如果您不在工作树的顶层目录中,则应使用--work-tree=<path>选项(或GIT_WORK_TREE环境变量)告诉Git工作树的顶层位置在哪里

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.