我开始使用git worktrees。它似乎有效,但我在尝试检出克隆工作树中的分支时遇到此错误:
fatal: '<branch>' is already checked out at '</other/location>'
如何在不删除.git/worktrees
目录的情况下解决此问题?
答案 0 :(得分:18)
Git不会让你两次检查同一个分支,因为如果你这样做,然后去两个工作树中的一个并做一个新的提交,当你回去时,你会为自己的痛苦做好准备到其他工作树。
如果您实际上已删除了其他工作树,只需运行git worktree prune
即可让Git意识到这一点。如果不实际删除了其他工作树,请不要检查两次:这没什么好玩的。
答案 1 :(得分:2)
如何在不删除.git / worktrees目录的情况下解决这个问题?
使用Git 2.17 +(2018年第二季度)可以更轻松,因为“git worktree
”已经学习了“move
”和“remove
”子命令。
commit 7f19def见Eric Sunshine (sunshineco
)(2018年3月4日)
请参阅commit ee6763a,commit cc73385,commit 78d986b,commit c64a8d2,commit 9f792bb,commit 9c620fc(2018年2月12日)和commit 4ddddc1(24 2018年1月)Nguyễn Thái Ngọc Duy (pclouds
)
(由Junio C Hamano -- gitster
--合并于commit bd0f794,2018年3月14日)
在您的情况下,您可以将现有的工作树移动到您现在想要的位置(尝试为同一分支创建新的工作树时)。
worktree move
:新命令此命令允许重新定位链接的工作树 主要的工作树不能(还)被移动。
和
的工作树
worktree move
:拒绝移动子模块子模块包含具有相对路径的
.git
个文件 在worktree move
之后,这些文件需要更新,或者它们可能无处可寻。这是一个绷带补丁,以确保“
worktree move
”不会破坏 人们的意外工作。
当.git
文件更新代码到位时,可以删除此validate_no_submodules()
。
注意:在Git 2.21(2019年第一季度)之前,当涉及子模块时,“git worktree remove
”和“git worktree move
”拒绝工作。
This has been loosened to ignore uninitialized submodules
答案 2 :(得分:1)
因为您不能在工作树和原始存储库中两次签出。在结帐工作树之前,将原始仓库结帐到其他地方怎么样?
git -C </other/location> checkout <branch>~1
git -C <worktree> checkout <branch>
答案 3 :(得分:1)
如果您在手册中搜索“worktree”git-checkout(1)
,您将find
git checkout --ignore-other-worktrees <branch>
答案 4 :(得分:0)
只需转到所需分支的worktree
目录,然后自动为checkout
。
在我的情况下,我有两个长期运行的worktree
,这意味着master
旁边有两个相关的分支。
$git branch
master # base stuff here
version-silver # some normal features
version-gold # some better features
有一个存储库,但我上面的每个分支都有3个单独的文件夹。并在master
中进行常见更改。然后将其与其他两个版本合并。
每个版本的具体更改也将放在相应的文件夹中,并且每个项目的工作都是隔离的,IDE也不会混淆。
希望有所帮助。
答案 5 :(得分:0)
请注意,如果您的$pwd
中包含链接,也会发生这种情况。检查之前,git
应该在readlink -f
上$pwd
。
编辑:或者这确实可能是因为我错过了打git worktree prune
的电话。现在可以了。
答案 6 :(得分:0)
如果您真的想,则可以通过直接修改相应HEAD文件中的ref或通过重新创建具有相同名称的分支(例如)来绕过此检查。 git checkout -B master origin/master
正如其他人所说,您需要知道自己在做什么;分支对于所有工作树都是通用的,更改一个工作树将立即影响另一个工作树的状态。