【问题标题】:How to delete all remote git branches which have already been integrated?如何删除所有已经集成的远程git分支?
【发布时间】:2012-01-04 00:14:27
【问题描述】:

在工作中,我们使用主题分支,这些分支有时会集成到几 (3) 个主分支中。 现在我想从我的 remote 存储库中删除所有已完全集成到主分支中的主题分支。如果这不可能,检索已集成的本地分支列表也可以。

【问题讨论】:

标签: git git-branch


【解决方案1】:

有人认为这是最好的(而且看起来不错)编辑的另一个答案

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

【讨论】:

  • 谢谢,git branch --merged 看起来不错。不幸的是,它不适用于在集成过程中重新设置的分支。但好吧,我的shitload (160) 个分支中至少有 一些 被列为超级安全的删除。
  • 重新定位的分支比较棘手......这可能是可能的,但它至少需要 shellscript 将在分支点之后拉出修订列表,然后沿着 master 寻找补丁签名分支...我不知道有任何预先准备好的解决方案。
  • 这太棒了,虽然我确实遇到了一些小问题。我用/ 命名我的分支,例如我的分支名称之一可能是sf/correct-typo-7。由于 cut 上的 -f 3 参数,此分支名称将被截断为 sf。将参数更改为-f 3-,更正此问题并处理带有任意数量斜杠的分支。
  • 为什么要一次删除一个?如果我们批量删除(通过删除-n 1)怎么办?
  • @FranklinYu,不知道,有人通过添加“正确”答案来帮助破坏我的答案。也许原因是您需要在每个分支之前添加--delete?并不是说我每天都进行批量删除……
【解决方案2】:

您可以一次性完成此操作

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

如果您发现自己经常这样做,请将其转储到名为“clean”的脚本中。

【讨论】:

  • 如果你想删除所有远程分支,而不仅仅是那些有本地对应的分支: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 谢谢!这对我有用,除非分支位于文件夹中 - 请改用cut -d "/" -f 3-。我还必须添加 grep -v develop 以阻止它尝试删除我的 dev 分支。
  • xargs -n 1 太慢了,如果你有很多分支,请改用xargs -n 20
  • 最好解释一下他们在做什么。
【解决方案3】:

如果要从源存储库中删除远程分支:

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

【讨论】:

  • 这对于分叉后移除所有上游分支也很有帮助
  • 这是真正的正确答案 :),因为其他人似乎无法删除包括斜线在内的分支,我们使用(尽管混合)功能/我的功能、错误修复/我的功能跨度>
  • 这看起来很不错,除了使用 origin/master 或 origin/develop 作为可以删除某些东西的标准非常重要。仅仅因为您将其合并到本地版本的主分支中而从远程删除某些内容是不行的,您有可能忘记将该分支推送到远程,这可能意味着从源中删除未合并的分支。
【解决方案4】:

这些是我用来删除所有内容并合并到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

【讨论】:

    【解决方案5】:

    仅适用于 Powershell 和 Windows 用户。

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

    【讨论】:

      【解决方案6】:

      对于 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 $_ }
      

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

      【讨论】:

        猜你喜欢
        • 2016-01-09
        • 2021-04-15
        • 2018-04-05
        • 2011-09-01
        • 2013-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多