Git -dir没有正常工作

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

希望有人能告诉我我做错了什么。

95501 次浏览

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

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

你可以阅读更多在这里

根据你上面的评论,听起来你仍然遇到了一个问题:

root@erx [/]# git --git-dir=/home/domain/.git --work-tree=/home/domain/ pull origin master
fatal: /usr/local/libexec/git-core/git-pull cannot be used without a working tree

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

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

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

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

 git -C "/home/domain/" status

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

然而,正如的评论中的OmarL所指出的:

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


参见提交44 e1e4 by Nazri Ramliy:

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

  1. (cd ~/foo && 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 && 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 --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”选项)的一个效果是指向禁用存储库发现

这一点在文档中被强调了一些,因为新用户经常会感到困惑。

参见提交d82ad54 (30 Jan 2020) by Heba Waly (HebaWaly) (由Junio C Hamano—gitster in 提交17 e4a1b合并,12 Feb 2020)

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

< p > 署名:Heba Waly < br > 协助: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工作树的顶层在哪里。