【问题标题】:Using `git --git-dir /path/to/git pull /path/to/other/bare-git master` doesn't automatically update the working tree. Why not?使用 `git --git-dir /path/to/git pull /path/to/other/bare-git master` 不会自动更新工作树。为什么不?
【发布时间】:2012-04-02 10:57:14
【问题描述】:

我发现 git 有一个奇怪的行为,我每次都可以在我的机器上重现它。

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

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

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

编辑:我又试了一次,但编辑了一个不同的文件,现在它可以工作了。我完全迷路了。

【问题讨论】:

  • 你期望 git 如何找到长格式的工作树?您是否尝试添加 --work-tree=... 参数?
  • express 内部是工作树以及.git 文件夹,就像一个普通的repo。
  • 当给 git 一个明确的 git-dir 时,你为什么期望它只是假设 git dir 的父级是一个工作树?在许多情况下,这可能是一个相当危险的假设(特别是,如果 git 目录实际上是一个裸仓库)
  • 好点。我仍然熟悉 git。到目前为止,我只遇到过裸仓库或工作树位于 .git 文件夹的父级的仓库,所以我认为它就像一个默认值。让我看看工作树选项是否解决了所有问题。
  • 大多数人甚至从不使用--git-dir--work-tree 标志。它们大多只在编写需要访问和访问其他存储库的深奥脚本时才有用。使用这些选项时,您需要指定所有内容,因为您明确告诉 git 不要遵循其默认的启发式方法来检测它们。

标签: git


【解决方案1】:

如果您运行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 )

【讨论】:

  • 有趣。在命令行中使用子shell,但问题是如果我在钩子脚本中执行(cd some/dir/.git && git pull),它将不起作用,我会收到一个错误,告诉我该位置不存在git repo (fatal: Not a git repository);无论我 cd 到绝对路径 /some/repo 还是 /some/repo/.git,都会出现同样的错误。这就是我使用--git-dir 和现在--work-tree 的原因。但是,我使用的是绝对路径,我仍然收到git-pull cannot be used without a working tree 错误。我的路径以/ 开头,这意味着它是绝对的,对吧?
  • 是的,以/ 开头意味着它是绝对的。也许路径是错误的?此外,您应该只使用(cd some/dir && git pull),而不是(cd some/dir/.git && git pull)。如果您可以在交互式终端中从该目录运行git pull,您应该可以从脚本中的子shell 执行此操作。
  • 不管路径中是否有 .git,我都会遇到同样的错误...当我从移动设备回来时,我会发布它。是的,我三次检查我输入的路径是否正确。
  • @trusktr:您是否设置了GIT_DIRGIT_WORK_TREE 环境变量? --git-dir--work-tree 参数应该覆盖这些参数。
  • 啊哈,原来这是我拥有的 git 版本的错误:stackoverflow.com/questions/9745941
猜你喜欢
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 2020-07-27
  • 2011-01-26
  • 2019-12-08
  • 2011-02-22
  • 1970-01-01
相关资源
最近更新 更多