是否有一种简单的方法可以删除所有远程对等分支不再存在的跟踪分支?
例子:
分支机构(本地和远程)
主人原始/主起源/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。
基于Git提示:删除旧的本地分支,这看起来类似于jason.rickman的解决方案。为此,我使用Bash实现了一个名为Git-gone的自定义命令:
$ git gone
usage: git gone [-pndD] [<branch>=origin]
OPTIONS
-p prune remote branch
-n dry run: list the gone branches
-d delete the gone branches
-D delete the gone branches forcefully
EXAMPLES
git gone -pn prune and dry run
git gone -d delete the gone branches
git gone-pn结合了修剪和列出“goned”分支:
$ git gone -pn
bport/fix-server-broadcast b472d5d2b [origin/bport/fix-server-broadcast: gone] Bump modules
fport/rangepos 45c857d15 [origin/fport/rangepos: gone] Bump modules
然后,您可以使用git-gone-d或git-gone-d来扣动扳机。
笔记
我使用的正则表达式是“$BRANCH/.*:gone]”,其中$BRANCH通常是源代码。如果您的Git输出本地化为法语等,这可能不会起作用。Sebastian Wiesner还为Windows用户将其移植到Rust。那个也叫git gone。
TL;博士:
删除所有不在远程上的本地分支
git fetch -p && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -D
删除所有不在远程AND上的本地分支,这些分支是完全合并的,并且没有像前面许多答案中所说的那样使用。
git fetch -p && git branch --merged | grep -v '*' | grep -v 'master' | xargs git branch -d
解释
gitfetch-p将删除远程上不再存在的所有分支gitbranch-vv将打印本地分支,修剪后的分支将标记为已删除grep“:gone]”仅选择已删除的分支awk“{print$1}”筛选输出以仅显示分支的名称xargs git branch-D将循环所有行(分支)并强制删除该分支
为什么选择gitbranch-D而不是gitbranch-D,否则对于未完全合并的分支,您将拥有。
error: The branch 'xxx' is not fully merged.