问题 Git - Bare repo不能拥有主分支的工作树 - 为什么?


我正在研究一些服务器端软件来进行合并。通过使用 git worktree 可以检查给定分支的裸仓库并将另一个分支合并到其中。即使有大型存储库,它也非常快。

唯一的例外似乎是合并 master。当我做 git worktree add /tmp/path/to/worktree master 我收到一个错误:

致命:'master'已在'/ path / to / bare / repo'签出

但这显然不是真的, git worktree list 得到:

/ path / to / bare / repo(bare)

...当然,在那条路上没有工作树,只有你期望的裸仓库文件。

更新: 我与git维护者联系,他们同意这可能是一个bug。我有一个初步补丁来测试。另外,我也能够重现了 期望 没有补丁的行为。

在这一点上,我不完全确定边界条件或根本原因是什么,并且可能会有来自git的修复。


8124
2017-10-05 20:20


起源

从阅读文档看起来你可能需要通过 -b 为此创建分支的选项。 - Mike Gorski
嗯。但是这个回购中有一个现有的主分支。错误消息似乎也证实了这一点。也许从我上面的描述中不清楚,但这种方法与其他分支(包括合并)工作正常(没有错误消息) 从 掌握到另一个分支。 - mtutty


答案:


事实证明这是git中的一个错误,从2.5及更高版本的worktree实现开始。

裸存储库仍然有一个HEAD reflink。 git(最多包括2.10)认为该链接所指向的是新克隆者的默认分支,并且(错误地)将其视为在活动工作树上。

我收到了来自git维护者的补丁来修复这种行为,它似乎有效。或者,应该可以在裸仓库上使用update-ref暂时从master切换。

我将测试这两个选项。


6
2017-10-10 17:05





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

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


3
2017-10-07 17:41