有没有办法分离和附加git工作树?

时间:2018-11-28 22:05:19

标签: git git-worktree

是否可以分离和附加git工作树?基本上,我希望有以下工作流程:

  1. 创建工作树
  2. 在完成一些工作(添加提交)之后分离工作树,该目录不应被删除
  3. 主要结帐中的结帐工作树分支
  4. 对公司服务器进行一些推入/推入/推入操作
  5. 重新附加工作树,并在必要时继续在现有目录上工作

为了解释我的工作流程背后的原因...我有很多设置都与主要结帐存储库的路径相关...这包括棉绒/预提交检查以及其他一些工作流程(设置很复杂,我不知道细节)...我理想上想做的是下面的从git worktree到仓库的主要结帐位置来回切换。...类似于您如何在分支之间切换。

例如我执行以下操作

  1. 在目录A中创建工作树分支A
  2. 进行一些编辑
  3. “解锁”工作树A
  4. 结帐分支主结帐目录中的分支
  5. 执行linting / pre-check操作(这些操作不会在分支中编辑任何文件)
  6. 主要结帐目录中的checkout master分支
  7. 返回编辑目录A中的工作树A

2 个答案:

答案 0 :(得分:0)

lock子命令(git worktree lock)专门用于防止主存储库在添加的工作树处于打开状态时不考虑工作树“消失”,例如,未始终挂载的拇指驱动器。这里的用例是:

  • 插入拇指驱动器,挂载文件系统
  • 在拇指驱动器上添加工作树,使用一会儿
  • 锁定工作树并删除(卸载和断开连接)拇指驱动器
  • 稍后,重新插入拇指驱动器,解锁工作树,继续工作

全部都在一台计算机上,只有一个主存储库。目前尚不清楚这是您的意思,还是您的意思:

  • 插入拇指驱动器并挂载文件系统
  • 在拇指驱动器上添加工作树,使用,锁定,卸载/删除驱动器
  • 在具有相同origin存储库的单独克隆的不同计算机(我们将其称为machine-X)上插入拇指驱动器
  • 在此处使用拇指驱动器工作树(在移除拇指驱动器时适当锁定/解锁,以便管理文件不会消失)

这可能有效,但存在一些问题。首先,没有正式的方法告诉Git:“我从未为该存储库创建的工作树现在突然存在,请添加它”。但是,如果您使用git worktree add在拇指驱动器工作树所在的位置创建工作树,然后将拇指驱动器安装在该区域上(可能是在移除工作树本身而Git却不知道),它将在一两个约束条件下起作用。

具体地说,当您在添加的工作树中时:

  1. 此工作树的HEAD和索引文件实际上位于主存储库中。
  2. 每次git add将文件复制到索引时,不仅主存储库中的索引本身会更新,底层Git对象也会进入主存储库。

因此,如果您要更改文件的内容(每个工作树HEAD和索引以及底层的Git对象文件),则还必须将它们带过来git worktree add之后的内容。如果没有,那么您在X机上执行的git worktree add就足以在交换拇指驱动器工作树之前进行设置。

(请注意,如果您 do 运行git add或修改HEAD,则底层存储库对象在2.15.0(已修复的Git版本)中并不安全。从本质上讲,主工作树可以在默认修剪时间(通常为14天)后对其进行gc操作。此警告的简短版本表示“不要将添加的工作树使用超过两周”,尽管这有点过分了,有点相关:在2.15.0之前的Git版本中,重命名可能在添加的工作树中的分支是错误的。)

答案 1 :(得分:0)

在完成某些工作(添加提交)后分离工作树,该目录不应被删除

是的,自2019年第一季度和Git 2.23起,这是可能的,现在使用Git 2.29(2020年第四季度)和git worktree本身(不需要git checkout --detach)变得更加清晰。

在Git 2.29(2020年第四季度)中,“ git worktree addman了解到“ -d”是“ {{1 }}“选项可创建一个新的工作树而无需在分支上。

请参见commit dccadadcommit c670aa4commit 07351d9Eric Sunshine (sunshineco)(2020年9月6日)。
(由Junio C Hamano -- gitster --commit 45f462b中合并,2020年9月18日)

worktree:教--detach认识add-d的简写

签名人:Eric Sunshine

git switch mangit checkout mangit worktree add < sup>(man)可以签出分支或设置独立的HEAD。

但是,与其他命令不同,git worktree add man不能将--detach理解为-d的简写,这可能会使用户感到困惑习惯于为此目的使用--detach

通过教导-d识别add-d来解决此缺点,从而使其与其他命令保持一致。

更一般地:

git-worktree.txt:讨论基于分支的工作树和一次性工作树

签名人:Eric Sunshine

默认情况下,git worktree add man创建与特定分支关联的新工作树(如果未在命令行上明确指定,则可能已自动创建该树) )。

创建不与任何分支关联的一次性工作树也很方便,这在进行实验性更改或进行测试时非常方便。

但是,后一种用例对于新来者来说可能并不明显,因为对工作树的高级描述只涉及“一次检查多个分支”。
因此,请增加描述以讨论这两种用例。

突出显示基于分支的工作树与一次性工作树之间的区别的第二个目标是帮助新手了解最简单的git worktree add <path> man形式会自动创建一个新分支

在说明的开头说明这一点,可能有助于新手避免在未意识到自己这样做的情况下创建分支,并且后来想知道为什么git branch --list man显示用户分支没有故意创建。

--detach现在包含在其man page中:

git worktree以最简单的形式自动创建一个 名称为git worktree add <path>的最终组成部分的新分支,即 如果您打算处理新主题,则非常方便。

例如,<path>创建新分支git worktree add ../hotfix并将其检出到路径hotfix

要改为在新工作树中的现有分支上工作,请使用../hotfix

另一方面,如果您只是计划进行一些实验性更改或进行测试而又不干扰现有开发,则通常很方便地创建与任何分支都不相关的“废弃”工作树。

例如,git worktree add <path> <branch>使用与当前分支相同的提交来创建带有分离的git worktree add -d <path>的新工作树。