你能用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了一个答案,它工作得很好:
- 打开terminal,或等效。
- inputgit branch | grep“模式”预览将被删除的分支。
- 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.*