我想清理我的本地存储库,它有大量的旧分支:例如3.2、3.2.1、3.2.2等。

我希望有个鬼鬼祟祟的办法能一次性把他们干掉。因为它们大多遵循点释放约定,我想也许有一个捷径可以说:

git branch -D 3.2.*

并杀死所有3.2。x分支。

我尝试了这个命令,当然,它不起作用。


当前回答

你可以使用git branch——list列出符合条件的分支,并使用git branch -D/ -D删除符合条件的分支。

一个程序示例:

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

其他回答

要根据指定的模式删除多个分支,请执行以下操作:

打开终端或同等工具,输入以下命令:

git branch | grep "<pattern>" (preview of the branches based on pattern)

git branch | grep "<pattern>" | xargs git branch -D (replace the <pattern> with a regular expression to match your branch names)

删除所有3.2。X个分支,你需要输入

git branch | grep "3.2" | xargs git branch -D

这是所有!

你可以开始了!

基于@gawi(上面)提供的答案,我做了一个可能有用的小函数。

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

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

removeBranchesWithPrefix somePrefix

Note

我有它目前设置为软删除,这意味着它不会删除分支,除非他们已经合并。如果你喜欢在边缘上生活,将-d更改为-d,它将删除所有带有前缀的东西!

你可以使用git branch——list列出符合条件的分支,并使用git branch -D/ -D删除符合条件的分支。

一个程序示例:

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

如果您已经安装了Git GUI(这是Windows的默认附加组件),那么它是最简单的。可以使用“ctrl”键选择多个分支,一键删除。

你可能会喜欢这个小物件…在最终删除所有选择之前,它会拉出列表并要求确认每个项目……

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.