使用'git--git-dir/path/to/git-pull/path/to/other/bare-git-master'don';t自动更新工作树。为什么不呢?

使用'git--git-dir/path/to/git-pull/path/to/other/bare-git-master'don';t自动更新工作树。为什么不呢?,git,Git,我发现git有一种特殊的行为,每次我都可以在我的机器上复制它 如果我有两个本地存储库,一个位于文件夹express.git中的裸存储库,另一个位于文件夹express中的非裸存储库具有工作树,两者都位于同一父文件夹中,我可以从express文件夹中执行命令git pull../express.git。这会自动更新express中的所有内容 但是,如果我从任何一个git存储库中都没有的位置运行命令git--git dir/home/cisw470p/stu006/express/.git pull

我发现git有一种特殊的行为,每次我都可以在我的机器上复制它

如果我有两个本地存储库,一个位于文件夹
express.git
中的裸存储库,另一个位于文件夹express中的非裸存储库具有工作树,两者都位于同一父文件夹中,我可以从
express
文件夹中执行命令
git pull../express.git
。这会自动更新
express
中的所有内容

但是,如果我从任何一个git存储库中都没有的位置运行命令git--git dir/home/cisw470p/stu006/express/.git pull/home/cisw470p/stu006/express.git master,那么
express
repo将提取更改,但不会自动更新工作树。然后我必须运行
git add.
来添加所有更改,然后从
express
内部再次提交,现在一切都好了

为什么使用--git dir选项的长版本命令不能自动更新
express
的工作树?这是有原因的,还是我发现了一个bug

编辑:我刚刚再试了一次,但编辑了另一个文件,现在它工作了。我完全迷路了。

如果运行
git--git dir=some/dir/.git pull
,默认情况下
git
将假定当前目录是工作树。不是
some/dir/.git
的父级,而是您当前的
pwd
。这意味着运行该命令将尝试更新当前目录,就像它是工作树一样,并最终将不属于该目录的文件写入
pwd

适当的解决方案是结合使用
--work tree
标志和
--git dir
来告诉它工作树在哪里。在本例中,您需要
git--git dir=some/dir/.git--work tree=some/dir pull
。然而,经过实验,这里似乎还有第二个问题。如果您按原样尝试此命令,可能会被告知没有工作树就不能使用git pull。这里的问题似乎是,
git
需要它的工作树是绝对路径,而不是相对路径


您真正想要运行的是
git--git dir=some/dir/.git--work tree=“$PWD”/some/dir pull
。或者,您也可以尝试
cd some/dir&&git pull
。如果您不想更改cwd,可以将其包装在子shell中,即
(cd some/dir&&git pull)

您希望git如何找到长格式的工作树?您是否尝试过添加
--work tree=…
arg?在
express
中,工作树与
.git
文件夹一起,就像普通的repo一样。当给
git
一个显式的git目录时,为什么您希望它只假设git目录的父目录是一个工作树?在许多情况下,这可能是一个相当危险的假设(特别是,如果git dir实际上是一个裸回购协议的话),这是一个很好的观点。我仍然对git很熟悉。到目前为止,我只遇到了裸回购或工作树位于.git文件夹父文件夹中的回购,所以我认为这就像是默认的。让我看看工作树选项是否解决了所有问题。大多数人甚至从不使用
--git dir
--work tree
标志。它们通常只在编写需要进入和浏览其他存储库的深奥脚本时才有用。当使用这些选项时,您需要指定所有内容,因为您显式地告诉git不要遵循其默认的启发式来检测它们。在命令行中使用子shell是可行的,但问题是如果我在钩子脚本中使用
(cd some/dir/.git&&git pull)
,它将不起作用,并且我将收到一个错误,告诉我该位置不存在git repo(
致命:不是git存储库
);无论是cd到绝对路径
/some/repo
还是
/some/repo/.git
,都会出现相同的错误。这就是为什么我求助于使用——git dir,现在是——工作树。然而,我使用的是绝对路径,并且我仍然得到
git pull不能在没有工作树的情况下使用。我的路径以
/
开头,这意味着它是绝对的,对吗?是的,以
/
开头意味着它是绝对的。也许这条路错了?另外,您应该只使用
(cd-some/dir&&git-pull)
,而不是
(cd-some/dir/.git&&git-pull)
。如果您可以在交互式终端中从该目录运行
git pull
,那么您应该能够从脚本中的子shell执行此操作。不管路径中是否有.git,我都会得到相同的错误。。。我从手机回来后再发。是的,我三次检查了输入的路径是否正确。@trusktr:您是否设置了
GIT\u DIR
GIT\u WORK\u树
环境变量?但是,
--git dir
--work tree
参数应该覆盖这些参数。啊哈,原来这是我的git版本的一个bug: