Git - 裸仓库不能有主分支的工作树 - 为什么?

14

我正在处理一些服务器端的软件合并问题。通过使用 git worktree,可以将一个裸仓库(bare repo)的某个分支检出并将另一个分支合并到它上面。即便对于大型代码库,这也非常快速。

唯一的例外似乎是合并到 master 分支。当我执行 git worktree add /tmp/path/to/worktree master 时,会出现以下错误:

fatal: 'master' is already checked out at '/path/to/bare/repo'

但事实显然并非如此,git worktree list 显示:

/path/to/bare/repo (bare)

...当然,在该路径下没有工作树,只有你所期望的裸仓库文件。

更新: 我联系了 git 维护者,他们同意这可能是一个 bug。他们给了我一个初步的补丁进行测试。此外,我还能够在没有补丁的情况下复制所需的行为。

此时我不太确定边界条件或根本原因是什么,并且可能会从 git 那里获得修复。


从阅读文档来看,似乎您需要传递“-b”选项才能创建一个分支使其工作。 - Mike Gorski
哦,但是这个版本库中已经存在一个主分支了。错误信息似乎也证实了这一点。也许从我的上面的描述不太清楚,但是这种方法在其他分支上都可以正常使用(没有错误信息),包括从主分支合并到另一个分支。 - mtutty
2个回答

8
原来这是git的一个bug,在2.5及更高版本中开始实施工作树时产生。
裸仓库仍然有一个HEAD reflink。无论该链接指向何处,git(包括2.10及以下版本)都认为它是新克隆者的默认分支,并且会错误地将其视为在活动工作树上。
我已经从git维护者那里收到了一个修复此行为的补丁,并且似乎有效。此外,可以使用裸仓库上的update-ref暂时切换到主分支。
我将测试这两个选项。

3

我认为这是不正确的。你可能想向他们报告。尽管情况似乎很明显,但我还没有找到任何讨论。

作为解决方法,您可以运行git update-ref --no-deref HEAD 'HEAD^{commit}'。它会分离当前的HEAD,使master不再被检出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接