如何删除所有已集成的远程git分支?
在工作中,我们使用主题分支,这些分支在某个时候被集成到几个(3)主分支中。如何删除所有已集成的远程git分支?,git,git-branch,Git,Git Branch,在工作中,我们使用主题分支,这些分支在某个时候被集成到几个(3)主分支中。 现在我想从我的远程存储库中删除所有主题分支,这些分支已经完全集成到主分支中。如果不可能,检索已集成的本地分支的列表也可以。另一个答案由认为它是最好的(而且看起来不错)的人编辑而成。: git branch -r --merged origin/master | grep -v master | grep "origin/" | cut -d "/" -f 2- | xargs -n 20 git push --delet
现在我想从我的远程存储库中删除所有主题分支,这些分支已经完全集成到主分支中。如果不可能,检索已集成的本地分支的列表也可以。另一个答案由认为它是最好的(而且看起来不错)的人编辑而成。:
git branch -r --merged origin/master | grep -v master | grep "origin/" | cut -d "/" -f 2- | xargs -n 20 git push --delete origin
说明:
git分支-r--合并的源/主
/-r
列出远程跟踪分支--remotes
仅列出其提示可从--合并的源代码/主代码
访问的分支源代码/主代码
从列表中删除任何包含grep-v master
的分支名称。1master
表示负匹配-v
仅选择grep“origin/”
remote上的分支origin
删除cut-d/-f2-
前缀origin/
执行类似于xargs-n20git推送--删除源文件
git推送--删除源文件分支-a分支-b分支-c…
/-n20
每个命令行最多使用20个参数--max args=20
-n
,我选择20作为例子。更少的参数会使它变慢,例如-n1
会使它一次删除一个;您有更多的进度提示,因为它将在每次删除分支时报告。更多像-n200
这样的参数会使它更快(总时间更短),但它只会每200个分支报告一次,这使您认为它一开始是冻结的(而实际上不是)。根据需要调整号码。如果省略此选项,则默认数字非常大(在我的机器中为2048)
一,。请注意,这也会删除origin/HEAD->origin/master
,但无论如何,您都不想弄乱origin/HEAD
原始答案:
git push --delete remote topicbranch
或
给出一个分支列表,可能是git branch的一些东西——合并的master您可以一次完成这项工作
git branch --merged master | grep -v master | xargs -n 1 git push --delete origin
如果发现经常这样做,请将其转储到名为“clean”的脚本中。如果要从源存储库中删除远程分支:
git branch -r --merged develop | egrep -iv '(master|develop)' | sed 's/origin\///g' | xargs -n 1 git push --delete origin
这些是我用来删除所有合并到
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
仅适用于Powershell和windows用户
git branch -r --merged | findstr /v "origin/master" | %{git push origin --delete $_.Trim().Substring(7)}
对于Windows机箱,我使用此PowerShell oneliner每周在构建系统上使用Windows计划任务清理所有合并的远程git分支:
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 $_ }
备注:它结合了大多数已经给出的答案,但没有限制分支清理的数量。谢谢,
git branch--merged
看起来不错。不幸的是,它不能与在集成过程中被重定基础的分支正常工作。。但是,至少我的一些分支(160个)被列为超级安全的删除分支。。。这可能是可能的,但至少需要shellscript,它将在分支点之后拉取修订列表,然后沿主分支查找修补程序签名。。。我不知道有任何预先煮好的解决方案。这太棒了,尽管我遇到了一个小问题。我用/
命名分支机构,例如,我的分支机构名称之一可能是sf/correct-typo-7
。由于cut上的-f3
参数,此分支名称将被截断为sf
。将参数更改为-f3-
,可以纠正此问题并处理带有任意斜杠数的分支。为什么每次删除一个?如果我们批量删除(通过删除-n1
)会怎么样?@FranklinYu,说不出来,有人故意破坏了我的答案,给它添加了一个“正确”的答案。可能是因为您需要在每个分支之前添加--delete
?并不是说我每天都进行批量删除……如果您想删除所有远程分支,而不仅仅是那些有本地对应分支的分支:git branch-a——合并的remotes/origin/master | grep-v master | grep“remotes/origin/“| cut-d”/“-f3 | xargs-n1 git push——删除origin
。另外,我建议使用remotes/origin/master
代替普通master
,以排除您在本地合并但尚未推送的内容,以防您最终忘记或决定不推送。@skalee谢谢!这对我来说很有效,除非分支位于文件夹中-请改用cut-d/-f3-
。我还必须添加一个grep-v develop
来阻止它试图删除我的开发分支。xargs-n 1
太慢了,如果有很多分支,请使用xargs-n 20
来代替。最好解释一下它们在做什么。这也有助于在分叉之后删除所有上游分支。这是真正正确的答案:),由于其他人似乎无法删除包括斜杠在内的分支,我们使用(混合使用)feature/my feature,bugfix/my FeatureUratis看起来相当不错,但使用origin/master或origin/develope作为删除某些内容的标准非常重要。仅仅因为您将某个分支合并到主分支的本地版本中,就从远程删除该分支是不合适的,您可能忘记将该分支推送到远程,这可能意味着从源位置删除未合并的分支。
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 $_ }