协慌网

登录 贡献 社区

删除跟踪分支不再在远程

是否有一种简单的方法可以删除远程等效不再存在的所有跟踪分支?

例:

分支机构(本地和远程)

  • 产地 / 主
  • 产地 / 漏洞修复,一个
  • 产地 / 漏洞修复 - B
  • 产地 / 漏洞修复 - C

在本地,我只有一个主分支。现在我需要处理bug-fix-a ,所以我检查它,处理它,并将更改推送到远程。接下来我用bug-fix-b做同样的事情。

分支机构(本地和远程)

  • 漏洞修复,一个
  • 漏洞修复 - B
  • 产地 / 主
  • 产地 / 漏洞修复,一个
  • 产地 / 漏洞修复 - B
  • 产地 / 漏洞修复 - C

现在我有本地分支机构masterbug-fix-abug-fix-b 。 Master 分支维护者将我的更改合并到master 中并删除他已经合并的所有分支。

那么现在的状态是:

分支机构(本地和远程)

  • 漏洞修复,一个
  • 漏洞修复 - B
  • 产地 / 主
  • 产地 / 漏洞修复 - C

现在我想调用一些命令删除分支(在本例中为bug-fix-abug-fix-b ),这些分支不再在远程存储库中表示。

它将类似于现有的命令git remote prune origin ,但更像是git local prune origin

答案

git remote prune origin prunes 跟踪分支不在遥控器上。

git branch --merged列出已合并到当前分支的分支。

xargs git branch -d删除标准输入上列出的分支。

小心删除git branch --merged列出的git branch --merged 。该列表可能包括您不想删除的master分支或其他分支。

要在删除分支之前给自己编辑列表的机会,可以在一行中执行以下操作:

git branch --merged >/tmp/merged-branches && vi /tmp/merged-branches && xargs git branch -d </tmp/merged-branches

命令之后

git fetch -p

运行时删除远程引用

git branch -vv

它将显示为 “已离开” 作为远程状态。例如,

$ git branch -vv
  master                 b900de9 [origin/master: behind 4] Fixed bug
  release/v3.8           fdd2f4e [origin/release/v3.8: behind 2] Fixed bug
  release/v3.9           0d680d0 [origin/release/v3.9: behind 2] Updated comments
  bug/1234               57379e4 [origin/bug/1234: gone] Fixed bug

因此,您可以编写一个简单的脚本来删除已经转移的本地分支:

git fetch -p && for branch in `git branch -vv | grep ': gone]' | awk '{print $1}'`; do git branch -D $branch; done

这些答案中的大多数实际上并未回答原始问题。我做了一堆挖掘, 是我找到的最干净的解决方案。这是一个稍微更全面的答案:

  1. 查看您的默认分支。通常是git checkout master
  2. 运行git fetch -p && git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d

说明:

通过修剪跟踪分支然后删除显示它们在git branch -vv中 “消失” 的本地git branch -vv

笔记:

如果你的语言设置为英语以外的东西,你将需要改变gone到合适的词。不会触及仅限本地的分支。已在远程删除但未合并的分支将显示通知但不会在本地删除。如果你想删除那些也改为-d-D