14

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

唯一的例外似乎是合并到master. 当我这样做时,git worktree add /tmp/path/to/worktree master我得到一个错误:

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

但这显然不是真的,git worktree list给出:

/path/to/bare/repo (裸)

...当然,该路径上没有工作树,只有您期望的裸 repo 文件。

更新:我与 git 维护人员取得了联系,他们同意这可能是一个错误。我从他们那里得到了一个初步的补丁来测试。此外,我还能够在没有补丁 的情况下重现所需的行为。

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

4

2 回答 2

8

原来这是 git 中的一个错误,从 2.5 及更高版本的工作树实现开始。

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

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

我将测试这两个选项。

于 2016-10-10T17:05:11.590 回答
3

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

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

于 2016-10-07T17:41:09.740 回答