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

例子:

分支机构(本地和远程)

主人原始/主起源/bug-fix-a起源/bug-fix-b起源/bug-fix-c

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

分支机构(本地和远程)

主人bug-fix-abug-fix-b型原始/主起源/bug-fix-a起源/bug-fix-b起源/bug-fix-c

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

因此,当前状态为:

分支机构(本地和远程)

主人bug-fix-abug-fix-b型原始/主起源/bug-fix-c

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

它类似于现有命令git remote prune origin,但更类似于git local prune origin。


当前回答

我喜欢使用管道,因为它使命令更容易阅读。

如果您想删除除master之外的所有分支,这是我的解决方案。

git branch | grep -v master | xargs -n 1 git branch -D

要删除符合条件的其他分支,请修改第一个和第二个块。

git branch --merged | grep feature_name | xargs -n 1 git branch -D

其他回答

我喜欢使用管道,因为它使命令更容易阅读。

如果您想删除除master之外的所有分支,这是我的解决方案。

git branch | grep -v master | xargs -n 1 git branch -D

要删除符合条件的其他分支,请修改第一个和第二个块。

git branch --merged | grep feature_name | xargs -n 1 git branch -D

我使用这种方法是为了更好地控制。

git branch-D$(git branch|grep-v“master”|grep/v“develop”)

这是删除所有未命名的分支:master或develop。

列出远程分支现在已消失的所有本地分支

#!/bin/sh
LC_ALL=C git for-each-ref --format='%(refname:short) %(upstream:track)' refs/heads/ |\
    sed -n '/ *\[gone\].*$/{s@@@;p}'

然后通过管道将其导入xargs git分支-D或-D。

此解决方案应与POSIX兼容。没有特定于shell的东西,只有POSIX兼容的sed/xargs。

LC_ALL=C通过强制英语使脚本语言保持中立对于每个引用,使用管道命令--format='%(refname:short)%(upstream:track)输出分支名称跟踪信息参考/仅负责本地分支机构sed-n'/*\[gone\].*$/匹配跟踪信息[gone],该信息不是有效分支名称的一部分,因此无需担心{s@@@;p}删除跟踪部分并仅打印这些行

nb:分支不能包含空格,因此我们不需要对xargs进行任何清理。

还有一个答案,因为没有一个解决方案符合我对优雅和跨平台的需求:

删除不在远程上的本地分支的命令:

for b in $(git for-each-ref --format='%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)' refs/heads); do git branch -d $b; done

要将其与gitconfig集成,以便可以使用git branch prune运行:

Bash

git config --global alias.branch-prune '!git fetch -p && for b in $(git for-each-ref --format='\''%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)'\'' refs/heads); do git branch -d $b; done'

PowerShell(PowerShell)

git config --global alias.branch-prune '!git fetch -p && for b in $(git for-each-ref --format=''%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)'' refs/heads); do git branch -d $b; done'

(需要帮助查找PowerShell和bash的通用命令)

为什么这个答案是最好的?

提供了一个完整的解决方案:向git添加一个git branch prune命令在Windows PowerShell中工作正常核心思想是@jason.rickman对每个裁判使用git的防弹方法分析和过滤是使用--filter完成的,因此不需要外部依赖项

说明:

在~\.gitconfig中添加新别名。执行此操作后,只需执行git分支修剪在此别名中:使用--prune标志获取分支,该标志“修剪不再位于远程的远程跟踪分支”对每个ref和--filter使用git,以获取分支列表(无远程)循环此列表并安全删除分支

git远程修剪源修剪跟踪不在远程上的分支。

gitbranch——merged列出已合并到当前分支中的分支。

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

请小心删除gitbranch--merged列出的分支。该列表可能包含您不希望删除的主分支或其他分支。

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

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