【问题标题】:Git: swap the main working tree with a linked working tree?Git:用链接的工作树交换主工作树?
【发布时间】:2019-09-04 19:42:27
【问题描述】:

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

我找到了git worktree move <worktree> <new-path>,但这不允许移动“主要”工作树,因此没有机会交换。

理想情况下,应该有一个git worktree swap <worktree> <path>,其中:

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

【问题讨论】:

  • 那么你的公司脚本很简单。在正确编写的一个中,管理员必须能够设置树的根路径。我强烈建议修复您的脚本。
  • @0andriy 我很清楚他们很烂,并且有意更新脚本。不幸的是,在为一家大公司工作时,您不能始终确保所有脚本都适用于每种情况,因此如果 repo 可以模仿明显的预期条件,那就更安全了。所以我想说你的评论非常无益,因为它试图掩盖一个仍然存在的问题。当新程序员不熟悉工具/技术的每个功能时,他们总是会做出不安全的假设。

标签: git git-worktree


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      理想情况下,您会:

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

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

      请参阅commit 810382ecommit d179af6commit 916133ecommit 4a3ce47commit dd9609acommit 1b14d40(2020 年 6 月 10 日)和commit c9b77f2(2020 年 6 月 8 日)Eric Sunshine (sunshineco)
      (2020 年 6 月 22 日由 Junio C Hamano -- gitster -- 合并于 commit 9740ef8

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

      签字人: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”不会将工作树移动到现有(非工作树)路径的顶部——这一限制一直存在但从未经过测试。

      【讨论】:

        猜你喜欢
        • 2021-12-03
        • 1970-01-01
        • 1970-01-01
        • 2022-10-24
        • 1970-01-01
        • 1970-01-01
        • 2015-03-07
        • 2020-09-27
        • 2015-08-26
        相关资源
        最近更新 更多