我正在研究 git 的“新”worktree功能,因为它似乎非常适合我经常面临的问题:需要同时在多个分支中工作(其中一些分支是短暂的,而另一些分支却是长期存在的)。
我通常需要在 上工作几个小时release_a branch,然后修复一些东西release_x branch,然后再修复一点release_h branch。由于我很懒,我最终所做的是使用 Intellij 设置 git 存储库的多个副本,因此我不需要不断地在这里或那里切换分支。
当我听说 git 的worktree命令时,我认为这正是我所寻找的——一种让单个存储库拥有多个工作目录的方法。作为一个很大的优点,这意味着每次我在分支上更改某些内容时,我实际上不再需要仅仅为了让另一个分支拉动它而推送东西(例如,对于修补程序)。我可以在本地合并它们。
我对 git 的理解worktree正确吗?
我一直在玩它,但我无法真正理解它是如何实现我的目的的。似乎默认情况下它会在其根文件夹上创建工作树,但如果我这样做,git add .这些相同的文件夹将包含在提交中。
这就是我为已经存在的分支创建工作树的方式my_branch(假设我当前是 @ master):
git worktree add my_branch my_branch
Run Code Online (Sandbox Code Playgroud)
所以我的问题有两个:
谢谢
根据文档,每个分支git worktree提供一个branch(dev/ feature/prod等),但对我来说这听起来也不合理,每个分支都有自己的文件夹,因为worktree它会创建许多文件夹,并且在某些时候可能会令人困惑。
一个git worktree可以支持多个吗branches?例如,所有属于哪个分支feature,然后在什么相关的时刻之间切换?这是正确的做法吗?
我刚刚了解了git worktree功能。它似乎很适合我的用例:我习惯于使用单独的存储库克隆来执行辅助任务。
我正在一个大型单一仓库中工作,有很多频繁的提交和大量的文件。它是如此之大,以至于许多任务都很慢。特别是git fetch和git push,但 Evengit status不再是瞬时的。
所以,git worktree听起来是个好主意,但如果它以任何明显的方式对性能产生负面影响,那绝对不值得。
是否存在多个工作树导致 git 性能变差的命令或场景?例如,是否git fetch需要做更多的事情,从而需要更长的时间?
我现在正在亲自尝试。但要进行精确的性能比较并不容易。例如,很难git fetch重复做同样的事情。
当我这样做时git worktree list,它显示如下。
/path/to/workspace c943d35 [master]
/path/to/workspace ef4df56 (detached HEAD)
Run Code Online (Sandbox Code Playgroud)
这是我的工作目录(不是工作树目录)。我不知道它是怎么发生的,以及如何清洁它。我试过了git worktree prune,但它不会改变任何东西。任何帮助将不胜感激。非常感谢。
我正在为我的项目使用Git Extensions.我很喜欢.有一个问题一直困扰着我,我很确定Git Extensions中有一个技巧.这是场景:
A,B并且C.A,做了一些改变B,我仍然看到更改,A因为他们没有提交
A因为我还没有完成,我不希望此提交出现在提交历史记录中A因为如果我进行更改B并切换到C,我也必须隐藏更改B==>更改A已消失:被新存储覆盖.我可以在不同的分支机构中制作许多藏匿处吗?
如果没有,最新的选择是stash什么?
是commit和revert commit我唯一的选择吗?
我喜欢在几个工作树上检查存储库,git worktree以便同时轻松地在不同的分支上工作.然而,当它在git worktree文件夹中时,VS代码似乎不会将git识别为scm.
我在文档中找不到关于此或扩展名的任何内容.关于如何在外部工作树中获得支持git功能的VS代码,有什么想法吗?
git visual-studio-code git-worktree windows-subsystem-for-linux
今天,我开始收到来自 git 的新警告,这是我以前从未见过的关于我的子模块的警告。例如:
warning: <hash_omitted>:.gitmodules, multiple configurations found for 'submodule.foo/bar'. Skipping second one!
Run Code Online (Sandbox Code Playgroud)
快速搜索似乎没有返回任何相关信息。我看到这里生成了警告,听起来可能与工作树有关?
这个警告究竟意味着什么,它的解决方案是什么?
我正在使用一个代码库,我需要为了不同的目的同时在多个分支上工作。所以我克隆到一个裸存储库,然后设置一些工作树:
git clone --bare ssh://git@git.example.com/project/repo repo.git
cd repo.git
git worktree add ../branch-1 branch-1
git worktree add ../branch-2 branch-2
... someone else creates branch-3 and pushes is ...
git fetch origin +refs/heads/*:refs/heads/* --prune
git worktree add ../branch-3 branch-3
Run Code Online (Sandbox Code Playgroud)
现在工作branch-3树没有设置为跟踪远程树并试图让它这样做,我陷入了可怕的混乱。
$ cd ../branch-3
$ git branch -u origin/branch-3
error: the requested upstream branch 'origin/refs/heads/feature/SW-5884-move-database-container-to-alpine-base-2' does not exist
hint: ...<snip>
$ git fetch +refs/heads/*:refs/remotes/origin/* --prune
$ git branch -u origin/branch-3
fatal: Cannot setup tracking information; starting point 'origin/feature/SW-5884-move-database-container-to-alpine-base-2' is not a …Run Code Online (Sandbox Code Playgroud) 为了与工作树一起使用,我正在尝试制作一个裸克隆,但是远程分支被映射到远程跟踪分支。
我正在尝试建立一个通用的工作树工作流程。我的 repo 真的很大,所以克隆它很昂贵。即使使用硬链接,随着 repos 被gc编辑,它们往往会随着时间的推移而发散并占用额外的空间,并且在一个 repo 中获取对另一个 repo 没有帮助,因此在工作树中工作似乎是显而易见的事情。(你必须相信我。)
工作树需要一个实际保存对象的“主”存储库。显然,该克隆不能被删除,所以我想把它放在像/var/cache/git/reponame.wt.git. (我正在为我和我的同事制定一个通用的解决方案,所以我必须使它相当万无一失。)
我可以让它成为一个普通的克隆,但是它必须有一个分支检出,然后该分支不能被任何其他工作树检出,所以我必须制作一个wt_dummy可能混淆人们的虚拟分支(例如)。我真正想做的是使主要回购成为bare回购。
问题是git clone --bare不创建远程跟踪分支。所以为了制作一个“裸回购但带有远程跟踪分支”,我已经开始走这条路
git clone --bare <remote> repo.tmp
mv repo.tmp.git reponame.wt.git
cd reponame.wt.git
git config core.bare true
git config --remove-section branch.master
... and I'm not quite there yet ...
Run Code Online (Sandbox Code Playgroud)
但是 a) 看起来太长太复杂了,并且 b) git 存储库仍然认为它已经master检出。
有没有更好的方法来制作这个“带遥控器的裸机”?
(也许总体上有更好的方法来设置工作树,但我知道这处于堆栈溢出的“特定编程解决方案”范围的毛茸茸的边缘。)
我注意到,如果我尝试git reset使用辅助工作树,它会根据主要工作树进行重置。
假设我在我的普通仓库中检出了master (d),并且在我的单独工作树中有功能 (f)。如果我这样做,git reset --hard head~1我最终会得到c而不是我所期望的e:
master _______a______c__d
feature \__b________e__f
Run Code Online (Sandbox Code Playgroud)
我试过寻找如何在工作树中正确重置,但一直找不到任何东西。