使用`git --git -dir/path/to/git pull/path/to/other/bare-git master`不会自动更新工作树.为什么不?

tru*_*ktr 6 git

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

如果我有两个本地存储库,一个裸存在文件夹内express.git,另一个非裸存在文件夹中的工作树,两个都在同一个父文件夹中,我可以git pull ../express.gitexpress文件夹内部执行命令.这会自动更新内部的一切express.

但是,如果我git --git-dir /home/cisw470p/stu006/express/.git pull /home/cisw470p/stu006/express.git master从位于任一git存储库中的位置运行命令,则expressrepo将提取更改,但不会自动更新工作树.然后我必须运行git add .以添加所有更改,然后从内部进行另一次提交express,现在一切都很好.

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

编辑:我只是再次尝试,但编辑了一个不同的文件,现在它工作.我完全迷失了.

Lil*_*ard 10

如果运行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 cannot be used without a working tree.看来这里的问题是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 ).