是否可以分离和附加git工作树?基本上,我希望有以下工作流程:
为了解释我的工作流程背后的原因...我有很多设置都与主要结帐存储库的路径相关...这包括棉绒/预提交检查以及其他一些工作流程(设置很复杂,我不知道细节)...我理想上想做的是下面的从git worktree
到仓库的主要结帐位置来回切换。...类似于您如何在分支之间切换。
例如我执行以下操作
答案 0 :(得分:0)
lock
子命令(git worktree lock
)专门用于防止主存储库在添加的工作树处于打开状态时不考虑工作树“消失”,例如,未始终挂载的拇指驱动器。这里的用例是:
全部都在一台计算机上,只有一个主存储库。目前尚不清楚这是您的意思,还是您的意思:
origin
存储库的单独克隆的不同计算机(我们将其称为machine-X)上插入拇指驱动器这可能有效,但存在一些问题。首先,没有正式的方法告诉Git:“我从未为该存储库创建的工作树现在突然存在,请添加它”。但是,如果您使用git worktree add
在拇指驱动器工作树所在的位置创建工作树,然后将拇指驱动器安装在该区域上(可能是在移除工作树本身而Git却不知道),它将在一两个约束条件下起作用。
具体地说,当您在添加的工作树中时:
HEAD
和索引文件实际上位于主存储库中。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 add
” (man)了解到“ -d
”是“ {{1 }}“选项可创建一个新的工作树而无需在分支上。
请参见commit dccadad的commit c670aa4,commit 07351d9,Eric Sunshine (sunshineco
)(2020年9月6日)。
(由Junio C Hamano -- gitster
--在commit 45f462b中合并,2020年9月18日)
worktree
:教--detach
认识add
是-d
的简写签名人:Eric Sunshine
像
git switch
(man)和git checkout
(man),git 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>
的新工作树。