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

Git - Bare repo cannot have a worktree for master branch - WHY?

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

唯一的例外似乎是合并到 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 维护者,他们同意这可能是一个错误。我从他们那里得到了一个初步的补丁来测试。此外,我还能够在没有补丁的情况下重现 desired 行为。

在这一点上,我不完全确定边界条件或根本原因是什么,git 可能会提供修复。

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

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

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

裸存储库仍然有一个 HEAD reflink。 link 指向的任何内容都被 git(直到并包括 2.10)视为新克隆程序的默认分支,并且(错误地)被视为好像它在活动的工作树上。

我从 git 维护者那里收到了修复此行为的补丁,它似乎有效。或者,应该可以在 bare repo 上使用 update-ref 暂时从 master 切换。

我将测试这两个选项。