如何删除已经集成的所有远程Git分支?

42

在工作中,我们使用主题分支(topic branches),这些分支最终会被整合到几个(3个)主分支(master branch)中。 现在,我想从我的远程代码仓库中删除所有已完全整合到主分支中的主题分支。如果不可能的话,也可以返回一个已整合的本地分支列表。


6个回答

58

另一个回答被某人编辑,他认为这是最好的(而且看起来不错):

git branch -r --merged origin/master | grep -v master | grep "origin/" | cut -d "/" -f 2- | xargs -n 20 git push --delete origin

解释:

  • git branch -r --merged origin/master
    • -r/--remotes 列出远程跟踪分支。
    • --merged origin/master 仅列出其提示可从 origin/master 到达的分支。
  • grep -v master 从列表中删除包含 master 的任何分支名称。1 -v 表示否定匹配。
  • grep "origin/" 仅选择 origin 远程上的分支。
  • cut -d "/" -f 2- 删除 origin/ 前缀
  • xargs -n 20 git push --delete origin 执行类似于 git push --delete origin branch-a branch-b branch-c … 的操作
    • -n 20/--max-args=20 每个命令行最多使用 20 个参数。

至于 -n,我只是选择了 20 作为示例。较少的参数会使它变慢,例如 -n 1 会逐个删除;您会得到更多的进度提示,因为它每次删除一个分支时都会报告。更多的参数,例如 -n 200,会使它更快(总时间更短),但它只会每 200 个分支报告一次,让您一开始认为它已经停止工作了(实际上并没有)。根据需要调整数字。如果省略此选项,则默认数字非常大(在我的机器上为 2048)。

1. 请注意,这也会删除 origin/HEAD -> origin/master,但是您不想干扰 origin/HEAD

原始答案:

git push --delete remote topicbranch

或者

git push remote :topicbranch

给出一个分支列表,可以使用 git branch --merged master 命令。

1
谢谢,git branch --merged 看起来不错。不幸的是,在集成过程中已经被 rebase 的分支无法正常工作...但好吧,至少我的一些(160)分支被列为超级安全可删除。 - ThiefMaster
重新定位分支更加棘手...这可能是可行的,但至少需要一个shell脚本来拉取分支点后的修订列表,然后在主分支上查找补丁签名...我不知道是否有任何预先准备好的解决方案。 - Michael Krelin - hacker
无论如何,既然这是被接受的答案,我建议编辑并解释管道的每个部分,因为通常其他用户会更改它以适应他们的需求。 - Franklin Yu
@FranklinYu,这就是这个“社区”的运作方式。我不能说我对此感到兴奋,但既然它是这样运作的,你的编辑建议可能会受到欢迎。我的观点是,让人们进行研究以适应他们的需求是可以接受的。:) 当今可观测宇宙中存在着太多的复制粘贴。 - Michael Krelin - hacker
谢谢这个很棒的命令!不过似乎有一个小错字。在你的解释中,你提到了命令的一部分为 cut -d "/" -f 2-,但实际上命令是 cut -d "/" -f 3- - lolsky
显示剩余5条评论

14

你可以一步完成这个操作,使用

git branch --merged master | grep -v master | xargs -n 1 git push --delete origin

如果你发现经常这样做,可以将其放入名为“ clean”的脚本中。


12
如果您想删除所有远程分支,而不仅是那些具有对应本地分支的分支,请使用以下命令:git branch -a --merged remotes/origin/master | grep -v master | grep "remotes/origin/" | cut -d "/" -f 3 | xargs -n 1 git push --delete origin。此外,我建议使用remotes/origin/master替代简单的master,以排除您已经在本地合并但尚未推送的内容,以防您最终忘记或决定不推送。 - skalee
2
@skalee 谢谢!这对我有用,除非分支在文件夹中 - 使用 cut -d "/" -f 3-。我还必须添加一个 grep -v develop 来防止它尝试删除我的 dev 分支。 - antonyh
1
"xargs -n 1" 太慢了,如果你有很多分支,请使用 "xargs -n 20"。 - mozillazg
最好解释一下他们正在做什么。 - Franklin Yu

13

如果您想从源代码库中删除远程分支:

git branch -r --merged develop | egrep -iv '(master|develop)' | sed 's/origin\///g' | xargs -n 1 git push --delete origin

这对于在分支后删除所有上游分支也非常有帮助。 - ianstarz
这是真正正确的答案:),因为其他人似乎无法删除包含斜杠的分支,而我们使用(混合)feature/my-feature、bugfix/my-feature功能。 - Tobias Hagenbeek
这看起来相当不错,除了使用origin/master或origin/develop作为可以删除某些内容的标准非常重要。仅仅因为你将其合并到主分支的本地版本中而从远程删除某些内容是不可行的,有可能你忘记将该分支推送到远程,这可能会导致从origin删除未合并的分支。 - Theodore Murdock

3

仅适用于PowerShell和Windows用户。

    git branch -r --merged  | findstr /v "origin/master" | %{git push origin --delete $_.Trim().Substring(7)}

1
这些是我用来删除合并到origin/master的所有内容的命令。基本上,我从GitHub中删除了所有合并到master的分支。
git remote update -p &&
git branch -r --merged origin/master |
grep origin |
grep -v master |
cut -d"/" -f2- |
xargs git push origin --delete

0

对于 Windows 系统,我使用这个 PowerShell 一行命令来清理所有合并的远程 Git 分支,我们会在构建系统上使用 Windows 计划任务来每周执行此操作:

git branch --all --merged remotes/origin/master | Select-String -NotMatch "master" | Select-String -NotMatch "HEAD" | Select-String "remotes/origin/" | Foreach-Object { $_.ToString().Replace("remotes/origin/", "").Trim() } | Foreach-Object { git.exe push origin --delete $_ }

备注:它结合了已经给出的大部分答案,但没有限制分支清理的数量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接