42

我开始使用 git worktrees。它似乎可以工作,但是在尝试签出克隆工作树中的分支时出现此错误:

fatal: '<branch>' is already checked out at '</other/location>'

如何在不删除.git/worktrees目录的情况下解决这个问题?

4

7 回答 7

42

Git 不会让你检查同一个分支两次,因为如果你这样做了,然后转到两个工作树中的一个并进行新的提交,当你回到另一个时,你会让自己陷入痛苦工作树。

如果您实际上已经删除了另一个工作树,只需运行git worktree prune以使 Git 意识到这一点。如果您实际上还没有删除其他工作树,请不要检查两次:这不好玩。

于 2017-01-09T11:00:23.757 回答
10

如果您在手册中搜索“工作树”,git-checkout(1)您会发现

git checkout --ignore-other-worktrees <branch>

但是您可能只想执行以下操作,因此当您移动(提交)一个工作树中的分支时,不会移动另一个工作树的 HEAD。

git checkout --detach <branch>
于 2021-05-21T04:43:15.583 回答
3

如何在不删除 .git/worktrees 目录的情况下解决这个问题?

使用 Git 2.17+(2018 年第二季度)你会更轻松,因为 " git worktree" 已经学习了 ' move' 和 ' remove' 子命令。

请参阅Eric Sunshine ( ) 的提交 7f19def(2018 年 3 月 4 日。 请参阅Nguyễn Thai Ngọc Duy ( )的提交 ee6763a提交 cc73385提交 78d986b提交 c64a8d2提交 9f792bb提交 9c620fc(2018 年 2 月 12 日)和提交 4ddddc1(2018 年 1 月 24 日) 。(由Junio C Hamano 合并 -- --提交 bd0f794中,2018 年 3 月 14 日)sunshineco
pclouds
gitster

在您的情况下,您可以现有工作树移动到您现在想要的位置(尝试为同一分支创建新工作树时)。

worktree move: 新命令

此命令允许重新定位链接的工作树。
主工作树(还)不能移动。

和:

worktree move: 拒绝移动带有子模块的工作树

子模块包含.git具有相对路径的文件。
在 a 之后worktree move,这些文件需要更新,否则它们可能会指向任何地方。

这是一个绷带补丁,以确保“ worktree move”不会意外破坏人们的工作树。
.git文件更新代码到位时,validate_no_submodules()可以将其删除。


注意:在 Git 2.21(2019 年第一季度)之前,当涉及到子模块时,“ git worktree remove”和“ git worktree move”会拒绝工作。
这已被放松以忽略未初始化的子模块

于 2018-03-17T00:24:35.290 回答
1

由于您不能在工作树和原始存储库中签出两次。在结帐工作树之前将原始回购结帐到其他地方怎么样?

git -C </other/location> checkout <branch>~1
git -C <worktree> checkout <branch>
于 2018-09-17T01:53:09.033 回答
0

如果你真的想要你可以绕过这个检查,或者通过直接修改相应 HEAD 文件中的 ref,或者通过重新创建具有相同名称的分支,例如git checkout -B master origin/master

正如其他人所说,您需要知道自己在做什么;分支对所有工作树都是通用的,更改一个工作树中的一个将立即影响另一个工作树的状态。

于 2019-08-05T09:44:28.797 回答
0

只需转到worktree所需分支的目录,它就会自动checkout为您服务。

就我而言,我有两个长期运行的worktree,这意味着master.

$git branch
master  # base stuff here
version-silver # some normal features
version-gold # some better features

有一个存储库,但对于上面的每个分支,我有 3 个单独的文件夹并排放置。并在master. 然后将其与其他两个版本合并。

每个版本的具体改动也会放在对应的文件夹中,每个项目的作品都是独立的,不会混淆IDE。

希望有帮助。

于 2017-07-21T05:06:12.300 回答
-1

请注意,如果您的链接中有链接,也会发生这种情况$pwdgit应该大概readlink -f$pwd之前检查。

编辑:或者这可能确实是因为我错过了电话git worktree prune。现在它正在工作。

于 2018-09-04T07:46:01.797 回答