标签: git-worktree

长期使用“git worktree”分支

我正在研究 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)

所以我的问题有两个:

  1. 是否可以/正确地为长期分支应用多个工作树,或者这只是暂时有意义的事情?
  2. 那么我应该如何正确删除不需要的工作树?
  3. 我应该让这些工作树存在于我的主 git 存储库内部还是外部?

谢谢

git version-control git-worktree

5
推荐指数
1
解决办法
1221
查看次数

一个git工作树支持多个分支吗?

根据文档,每个分支git worktree提供一个branchdev/ feature/prod等),但对我来说这听起来也不合理,每个分支都有自己的文件夹,因为worktree它会创建许多文件夹,并且在某些时候可能会令人困惑。

一个git worktree可以支持多个吗branches?例如,所有属于哪个分支feature,然后在什么相关的时刻之间切换?这是正确的做法吗?

git git-worktree

5
推荐指数
2
解决办法
1797
查看次数

Git 工作树性能影响

我刚刚了解了git worktree功能。它似乎很适合我的用例:我习惯于使用单独的存储库克隆来执行辅助任务。

我正在一个大型单一仓库中工作,有很多频繁的提交和大量的文件。它是如此之大,以至于许多任务都很慢。特别是git fetchgit push,但 Evengit status不再是瞬时的。

所以,git worktree听起来是个好主意,但如果它以任何明显的方式对性能产生负面影响,那绝对不值得。

是否存在多个工作树导致 git 性能变差的命令或场景?例如,是否git fetch需要做更多的事情,从而需要更长的时间?

我现在正在亲自尝试。但要进行精确的性能比较并不容易。例如,很难git fetch重复做同样的事情。

git performance git-worktree monorepo

5
推荐指数
1
解决办法
550
查看次数

Git 工作树:两个工作树指向同一个位置,不能被修剪

当我这样做时git worktree list,它显示如下。

/path/to/workspace  c943d35 [master]
/path/to/workspace  ef4df56 (detached HEAD)
Run Code Online (Sandbox Code Playgroud)

这是我的工作目录(不是工作树目录)。我不知道它是怎么发生的,以及如何清洁它。我试过了git worktree prune,但它不会改变任何东西。任何帮助将不胜感激。非常感谢。

git git-worktree

4
推荐指数
1
解决办法
1293
查看次数

Git:藏匿的替代方案

我正在为我的项目使用Git Extensions.我很喜欢.有一个问题一直困扰着我,我很确定Git Extensions中有一个技巧.这是场景:

  • 从master分支,我创建了3个分支A,B并且C.
  • 开始在分公司工作A,做了一些改变
  • 切换到分支B,我仍然看到更改,A因为他们没有提交
    • 我不想提交更改,A因为我还没有完成,我不希望此提交出现在提交历史记录中
    • 我不想隐藏更改,A因为如果我进行更改B并切换到C,我也必须隐藏更改B==>更改A已消失:被新存储覆盖.

我可以在不同的分支机构中制作许多藏匿处吗?
如果没有,最新的选择是stash什么?
commitrevert commit我唯一的选择吗?

git git-extensions git-worktree

4
推荐指数
1
解决办法
985
查看次数

有没有办法让VS代码与git worktree一起工作?(带WSL的Windows)

我喜欢在几个工作树上检查存储库,git worktree以便同时轻松地在不同的分支上工作.然而,当它在git worktree文件夹中时,VS代码似乎不会将git识别为scm.

我在文档中找不到关于此或扩展名的任何内容.关于如何在外部工作树中获得支持git功能的VS代码,有什么想法吗?

git visual-studio-code git-worktree windows-subsystem-for-linux

4
推荐指数
1
解决办法
928
查看次数

Git子模块警告“发现多个配置”

今天,我开始收到来自 git 的新警告,这是我以前从未见过的关于我的子模块的警告。例如:

warning: <hash_omitted>:.gitmodules, multiple configurations found for 'submodule.foo/bar'. Skipping second one!
Run Code Online (Sandbox Code Playgroud)

快速搜索似乎没有返回任何相关信息。我看到这里生成了警告,听起来可能与工作树有关?

这个警告究竟意味着什么,它的解决方案是什么?

git git-submodules git-worktree

4
推荐指数
2
解决办法
3108
查看次数

git 裸仓库、工作树和跟踪分支

我正在使用一个代码库,我需要为了不同的目的同时在多个分支上工作。所以我克隆到一个裸存储库,然后设置一些工作树:

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)

git git-bare git-branch git-worktree

4
推荐指数
3
解决办法
3090
查看次数

Git clone - 创建一个带有远程跟踪分支的裸克隆(用于工作树“主”存储库)

为了与工作树一起使用,我正在尝试制作一个裸克隆,但是远程分支映射到远程跟踪分支。

我正在尝试建立一个通用的工作树工作流程。我的 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 git-worktree

2
推荐指数
1
解决办法
727
查看次数

如何在工作树中`git reset`?

我注意到,如果我尝试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)

我试过寻找如何在工作树中正确重置,但一直找不到任何东西。

git git-reset git-worktree

2
推荐指数
1
解决办法
269
查看次数