我在Git-worktree上阅读了Github的帖子.他们写:
假设您正在一个名为的分支上的Git存储库中工作
feature,当用户报告高紧急性错误时master.首先,您创建一个带有新分支的链接工作树,hotfix相对于主分析签出[...]您可以修复错误,推送修补程序,并创建拉取请求.
当我在一个名为feature的分支上工作并报告master中的一些高紧急性bug时,我通常会隐藏我正在处理的任何内容并创建一个新的分支.当我完成后,我可以继续工作.这是一个非常简单的模型,我多年来一直这样做.
另一方面,使用git-worktree有其自身的局限性:
例如,不允许同时在两个链接的工作树中检出相同的分支,因为这将允许在一个工作树中提交的更改使另一个工作树不同步.
为什么我会为已经解决的问题选择更复杂的工作流程?
是否有任何关于git-worktree事先无法完成的事情,这证明了这一全新的复杂功能?
我最近发现了这个git worktree命令:
新的工作目录链接到当前存储库,共享除工作目录特定文件(如HEAD,索引等)之外的所有内容.
但是文档也表明了这一点
...对子模块的支持不完整.建议不要对超级项目进行多次检出.
没有进一步解释什么是错误的.
有人可以告诉我有关预期的问题吗?例如,如果我使用以这种方式生成的单独工作树仅用于不影响子模块的更改,我会没事吗?
我开始使用git worktrees.它似乎工作,但我在尝试检出克隆的工作树中的分支时遇到此错误:
fatal: '<branch>' is already checked out at '</other/location>'
Run Code Online (Sandbox Code Playgroud)
如何在不删除.git/worktrees目录的情况下解决这个问题?
我在一个大型Scala项目上工作,我们使用Git进行版本控制.我的工作流程是在我自己的分支中处理新功能并在需要时切换.各种版本的代码都在自己的分支中.一切都很标准.
如果我必须修复某个版本的代码中的错误,我将切换到正确的分支,修复错误,提交然后切换回我所在的位置.
问题是虽然git在我转到另一个分支后立即进行,我必须重新编译代码.这需要几分钟.然后修复bug,切换回我自己的分支并再做一次重新编译,这需要几分钟.这似乎打败了Git这么快的目的.
有人遇到过这种情况么?有没有办法解决它.我确定这不是Scala特定的问题(尽管Scala在编译时速度很慢).
3年多后更新
在过去的几年里,我一直在使用@djs的答案(git-new-workdir).它对我来说非常好用.我有一个主目录和几个其他目录(如生产,下一个发布等),当我需要在那里工作时,我切换到.开销非常小,这意味着您可以快速切换到说,生产,测试某些东西,然后切换回您正在处理的内容.
更新7年以后
看起来git-worktree是git-new-workdir的替代品.使用:
cd ~/git/my-repo
git worktree add ~/git/my-linked-repo
Run Code Online (Sandbox Code Playgroud) 我是Git的新手.我搜索了很多,但没有发现与我的情况完全匹配.
我有一个个人的WinForms应用程序,在我的远程仓库中有3个分支(主分支和2个长分支):
master #the common features are here like Core, DAL,...
north #customized for A company (long-running)
razavi #customized for B company (long-running)
Run Code Online (Sandbox Code Playgroud)
在我的办公室电脑上,我worktree为这些north和razavi分支机构添加2 :
$ git worktree list
C:/Source/nis a6fb6e1 [master]
C:/Source/north ebc7670 [north]
C:/Source/razavi eed08a2 [razavi]
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都还可以,我决定从家里开始研究这个项目,但是在我的家用电脑上,当我尝试为这两个分支添加工作树时,它给了我一个错误:
$git worktree add -b north ../north north
fatal: A branch named 'north' already exists.
Run Code Online (Sandbox Code Playgroud)
我删除-b开关以不添加新分支,但它也不起作用.
如何worktree从现有的非本地分支添加远程?
更新(解决方案)
在解决了一段时间之后,我找到了解决问题的方法,实际上,这是一个--checkout错过的开关:
$ git worktree add --checkout ../north north
Run Code Online (Sandbox Code Playgroud)
我也会把它放在答案中.
我曾经git worktree add创建过一个新的工作树.我注意到它在repo中创建了一个与工作树同名的新分支.这个分支是什么?
我已在第二个工作树中检出了另一个已存在的分支.我可以自由删除git worktree add创建的分支吗?
我正在研究一些服务器端软件来进行合并.通过使用git worktree它可以检查给定分支的裸仓库并将另一个分支合并到其中.即使有大型存储库,它也非常快.
唯一的例外似乎是合并master.当我这样做时,git worktree add /tmp/path/to/worktree master我收到一个错误:
致命:'master'已在'/ path/to/bare/repo'检出
但这显然不正确,git worktree list给出:
/ path/to/bare/repo(bare)
...当然,在那条路上没有工作树,只有你期望的裸仓库文件.
更新:我与git维护者联系,他们同意这可能是一个错误.我有一个初步补丁来测试.此外,我还能够在没有补丁的情况下重现所需的行为.
在这一点上,我不完全确定边界条件或根本原因是什么,并且可能会有来自git的修复.
鉴于我已经跑了
$ git worktree add ~/worktrees/a
$ cd ~/worktrees/a
$ git status
On branch a
Run Code Online (Sandbox Code Playgroud)
我想将工作树和分支的名称从 更改a为b。
有件事我很难理解:
如何在 VS-code 中使用 git worktrees ?
我显然无法让它发挥作用。
我尝试过使用命令行...但是当我尝试签出所需的分支时,它告诉我:
错误:命令失败:C:\Program Files\Git\cmd\git.exe -c core.longpaths=true -c core.quotepath=false -c color.ui=false 结帐序列 --
致命:“序列”已在以下位置检出
当我在命令行中更改文件夹时,就像在很多视频中(在 vs-code 之外)一样......它保持相同的分支签出。
有人可以帮助我或向我指出一个资源/博客来指示如何继续或如何配置以使 git worktree 与 vs-code 一起使用吗?
使用 git worktrees 与使用 flag 维护多个克隆相比有何优缺点--reference?我考虑的主要场景是,开发人员需要在磁盘上维护旧版本的多个 git 存储库(release/1.0、release/2.0、release/3.0),因为在单个 git 存储库上切换分支和重建成本高昂。
cd /opt/main/使用工作树,开发人员可以拥有存储库的单个克隆,并且可以使用,将任何旧版本创建为存储库的工作树git worktree add /opt/old_release_1 release/1.0。使用参考克隆,开发人员在某处维护主克隆,并使用cd /opt/old_release_1,git clone --reference /opt/main/.git ssh://git@github.com/myrepo.git为旧版本创建克隆存储库。
看起来他们都可以实现相同的目标。在速度、磁盘空间……其他方面,两者相比是否有优势?
git ×10
git-worktree ×10
branch ×2
git-bare ×1
git-branch ×1
git-remote ×1
merge ×1
recompile ×1
scala ×1