5

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

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

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

  • 如果<path>是工作树,则交换它们
  • 如果<path>是 commit-ish,它会为 commit-ish 添加一个名为<worktree>' 的新工作树,然后交换它们
4

3 回答 3

0

理想情况下,您会:

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

后者也可以移动,但如果这样做,请确保使用 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”不会将工作树移动到现有(非工作树)路径的顶部——这是一个一直存在但从未测试过的限制。

于 2020-06-27T22:17:13.377 回答
0

没有自动移动主工作树的方法,但是,您可以手动进行:

  • 重命名主工作树,例如mv master main
  • 编辑.git每个链接工作树中的文件以反映该更改,例如:sed -i 's!/master/!/main/!' .git

.git是主工作树中的一个目录,但只是一个文本文件,其中包含链接工作树中主工作树的路径,您可以使用您喜欢的编辑器对其进行编辑。

于 2021-01-04T19:05:03.003 回答
0

简短的回答是否定的:主工作树与所有添加的工作树不同。

请注意,您可以使用and/or环境变量和/或and/or选项将.git目录与任何工作树分开(只需设置环境变量,然后像最初设置环境变量一样继续进行操作)。但一般来说,存储库的主要工作树是特殊的:例如,它的文件位于,而不是。$GIT_DIR$GIT_WORK_TREE--git-dir--git-work-treeHEAD.git/HEAD.git/worktrees/<name>/HEAD

(工作树W的每个工作树状态通常存储在中。)$GIT_DIR/worktrees/W

于 2019-09-04T20:43:46.267 回答