你能用Git在一个命令中删除多个分支吗?

我想清理我的本地仓库,它有很多旧的分支:例如3.2.2

我希望一个鬼祟的方式,一次删除了很多人。 由于他们大多遵循点发布惯例,所以我想也许有一个捷径来说:

 git branch -D 3.2.* 

并杀死所有的3.2.x分支。

我尝试了这个命令,当然,它没有工作。

不是这样的语法。 但是你可以这样做:

 git branch -D 3.2 3.2.1 3.2.2 

基本上,git分支将通过一次调用删除多个分支。 不幸的是,它不会完成分支名称。 虽然在bash中,你可以这样做:

 git branch -D `git branch | grep -E '^3\.2\..*'` 
 git branch | cut -c3- | egrep "^3.2" | xargs git branch -D ^ ^ ^ ^ | | | |--- create arguments | | | from standard input | | | | | |---your regexp | | | |--- skip asterisk |--- list all local branches 

编辑:

一个更安全的版本(由JakubNarębski和Jefromibuild议),作为git分支输出并不意味着在脚本中使用:

 git for-each-ref --format="%(refname:short)" refs/heads/3.2\* | xargs git branch -D 

…或者无xargs:

 git branch -D `git for-each-ref --format="%(refname:short)" refs/heads/3.2\*` 

那么,在最坏的情况下,你可以使用:

 git branch | grep '3\.2' | xargs git branch -d 

使用

 git for-each-ref --format='%(refname:short)' 'refs/heads/3.2.*' | xargs git branch -D 

最近,我正在寻找同样的问题的解决scheme,最后我find了一个答案,它工作得很好:

  1. 打开terminal,或等效。
  2. inputgit branch | grep“模式”预览将被删除的分支。
  3. inputgit branch | grep“pattern”| xargs git分支-D

这个解决scheme非常棒,如果你想要完整的解释每个命令,以及它是如何工作的,在这里给出它。

我根据@gawi(上面)提供的答案提出了一个小函数。

 removeBranchesWithPrefix() { git for-each-ref --format="%(refname:short)" refs/heads/$1\* | xargs git branch -d } 

将其添加到.bash_profile并重新启动您的terminal。 然后你可以像这样从命令行调用:

 removeBranchesWithPrefix somePrefix 

注意

我目前设置了一个软删除,这意味着它不会删除分支,除非他们已经被合并。 如果你喜欢住在边缘,把-d改为-D ,它将删除所有的前缀,不pipe!

如果你不限制使用git命令提示符,那么你总是可以运行git gui并使用Branch-> Delete菜单项。 select你想要删除的所有分支,并让它翻录。

您可能会喜欢这个小项目…它拉出列表,并要求确认每个项目,最后删除所有select…

 git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "remove branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done` 

使用-D强制删除(像往常一样)。

为了便于阅读,这里是一行一行的分解…

 git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "remove branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done` 

这里是xargs方法…

 git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "remove branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done | xargs git branch -D 

最后,我喜欢在我的.bashrc中有这个

 alias gitselect='git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "select branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done' 

这样我可以说

 gitSelect | xargs git branch -D. 

在Git中,所有的分支都没有引用git repo,为什么不直接删除去.git/ref的分支,然后如果有什么东西被遗漏,那么在存储库中就不会有意思了你不需要打扰。

我在Windows上,你可以使用PowerShell来做到这一点:

  git branch | grep 'feature/*' |% { git branch -D $_.trim() } 

用你喜欢的任何模式replacefeature/*

您可以使用git分支–list列出符合条件的分支,然后使用git分支-D / -d(取决于您的需要)删除。 例如:

 git branch -D `git branch --list '3.2.*'` 

你可以删除所有的分支,删除所有不必要的参考:

rm .git/refs/heads/3.2.*