首页 > 解决方案 > Git:用链接的工作树交换主工作树?

问题描述

我正在尝试找出是否有任何方法可以交换工作树。我的公司有很多假定特定目录结构的脚本,因此为了能够使用多个工作树,我需要“新”链接工作树来代替主工作树。

我发现git worktree move <worktree> <new-path>但这不允许移动“主要”工作树,所以没有交换的机会。

理想情况下,会有一个git worktree swap <worktree> <path>地方:

标签: gitgit-worktree

解决方案


理想情况下,您会:

  • 将主工作树移到别处
  • 将“特定目录”中的符号链接添加到主工作树或任何其他工作树。

后者也可以移动,但如果这样做,请确保使用 Git 2.28(2020 年第三季度):同一个工作树目录只能注册​​一次,但“git worktree移动”允许违反此不变量,已使用 Git 更正2.28.

请参阅Eric Sunshine ( ) 的提交 810382e提交 d179af6提交 916133e提交 4a3ce47提交 dd9609a提交 1b14d40(2020 年 6 月 10 日)和提交 c9b77f2(2020 年 6 月 8日(由Junio C Hamano 合并 -- --提交 9740ef8中,2020 年 6 月 22 日)sunshineco
gitster

worktree:使“移动”拒绝在丢失的已注册工作树上移动

签字人:Eric Sunshine

" git worktree add" 特别注意避免在已注册到现有工作树的位置创建新工作树,即使该工作树丢失(例如,如果工作树驻留在可移动媒体上,可能会发生这种情况)。

然而, “ git worktree move”在验证目标位置时并不那么小心,并且会很高兴地将源工作树移动到丢失的工作树位置的顶部。
这导致多个工作树与同一路径相关联的异常情况,这是设计明确禁止的。

例如:

$ git clone foo.git
$ cd foo
$ git worktree add ../bar
$ git worktree add ../baz
$ rm -rf ../bar
$ git worktree move ../baz ../bar
$ git worktree list
.../foo beefd00f [master]
.../bar beefd00f [bar]
.../bar beefd00f [baz]
$ git worktree remove ../bar
fatal: validation failed, cannot remove working tree:
    '.../bar' does not point back to '.git/worktrees/bar'

通过增强“”来修复这个缺点,git worktree move以执行与“”相同的目标目录的附加验证git worktree add

在此期间,添加一个测试以验证“ git worktree move”不会将工作树移动到现有(非工作树)路径的顶部——这是一个一直存在但从未测试过的限制。


推荐阅读