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

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

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

git branch -D 3.2.*

并杀死所有3.2。x分支。

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

195246 次浏览

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

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

编辑:

一个更安全的版本(由Jakub narabbski和Jefromi建议),因为git分支输出并不用于脚本:

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

... 或者xargs-free:

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

使用

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

嗯,在最坏的情况下,你可以用:

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

因为在Git中,所有的分支都没有引用到Git repo,为什么你不删除指向.git/ref的分支,然后如果有任何在存储库中不感兴趣的东西被遗漏,将自动被垃圾收集,所以你不需要麻烦。

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

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

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

removeBranchesWithPrefix somePrefix

请注意

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

如果你不局限于使用git命令提示符,那么你总是可以运行git gui并使用Branch->Delete菜单项。选择所有你想删除的分支,让它撕裂。

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

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.

如果你在windows上,你可以使用powershell来做这个:

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

用你喜欢的任何模式替换feature/*

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

  1. 打开终端,或等价的。
  2. 在git分支| grep " pattern "中输入一个预览分支 这将被删除
  3. 输入git branch | grep " pattern " | xargs git branch -D

这个解决方案很棒,如果你想要每个命令的完整解释以及它是如何工作的,它给出了在这里

你可以删除所有的分支,删除所有不必要的引用:

rm .git/refs/heads/3.2.*

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

一个程序示例:

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

可以使用这个命令:git branch -D $(printf "%s\n" $(git branch) | grep '3.2')

你可以使用git gui一次删除多个分支。 从命令提示符/Bash -> git gui ->远程->删除分支…->选择要移除的远程分支->删除

对于使用PowerShell的纯灵魂,这里是小脚本 Git branch -d $(Git branch——list '3.2.;*' | %{$_.Trim()}) < /代码> < / p >

也许你会发现这很有用:

如果你想删除所有不是'master', 'foo'和'bar'的分支

git branch -D `git branch | grep -vE 'master|foo|bar'`

Grep -v 'something'是一个带有反转的匹配器。

如果你真的需要清理所有的树枝,那就试试

git branch -d $(git branch)

它将删除所有本地合并分支,除了您当前签入的分支。

这是一个让你的地方变得干净的好方法

git branch -D <branchName>

这对我来说是正确的:

git branch | xargs git branch -d


git branch | xargs git branch -D

删除所有本地分支

使用以下命令删除所有分支(签出的分支不会被删除)。

git branch | cut -d '*' -f 1 | tr -d " \t\r" | xargs git branch -d

编辑:我使用的是Mac Os

Powershell的解决方案:

如果你正在运行窗口,你可以使用PowerShell一次删除多个分支…

git branch -D ((git branch | Select-String -Pattern '^\s*3\.2\..*') | foreach{$_.ToString().Trim()})
//this will remove all branches starting with 3.2.


git branch -D ((git branch | Select-String -Pattern 'feature-*') | foreach{$_.ToString().Trim()})
// this will delete all branches that contains the word "feature-" as a substring.

您还可以使用Powershell的Select-String命令对模式匹配的工作方式进行微调。看看powershell文档

我今天刚刚清理了一大批过时的本地/远程分支机构。

以下是我的做法:

1. 列出所有分支名称到一个文本文件:

git branch -a >> BranchNames.txt

2. 附加我想删除的分支到命令"git branch -D -r":

git branch -D -r origin/dirA/branch01 origin/dirB/branch02 origin/dirC/branch03(…附加任何分支名称)

3.执行CMD命令

这个比“Git push origin——delete”工作得更快更可靠。

这可能不是其他答案中列出的最聪明的方法,但这个方法非常直接,而且易于使用。

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

如果你正在使用Fish shell,你可以利用string功能:

git branch -d (git branch -l "<your pattern>" | string trim)

这与其他一些答案中的Powershell选项没有太大区别。

我把我的首字母和破折号(at-)作为分支名称的前三个字符,原因如下:

git branch -D `git branch --list 'at-*'`

保持“开发”,并删除所有其他在本地

    git branch | grep -v "develop" | xargs git branch -D
如果你在一个文本文件(branches-to-del.txt)中删除了所有的分支(每行一个分支),那么你可以这样做,从远程(origin)删除所有这样的分支: Xargs -一个分支到del.txt git推送-删除原点 < /代码> < / p >

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

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

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

这是所有!

你可以开始了!

如果你想删除多个分支进行清理,这是可行的

 git branch -d branch1 branch2 branch3

此外,如果你想反映删除操作到远程,你可以使用这个来推送它们

 git push origin --delete branch1 branch2 branch3
#deleting branch names  started with 202008*   Tested on centos7

git branch | grep $202008 | xargs git branch -D

你可以试试

git branch | grep $3.2. | xargs git branch -D

git branch -d branch1 branch2 branch3已经工作了,但在Git 2.31(2021年第一季度)中会更快。
以前,当删除许多分支和标记时,代码习惯一次引用一个。
它可以使用另一个API来删除多个引用,当引用被打包时,它会产生相当大的性能差异

参见提交8198907 (20 Jan 2021) by 菲尔·霍德(phord)
(由Junio C Hamano—gitster in 提交f6ef8ba合并,05 Feb 2021)

8198907795:在删除标签或分支时使用delete_refs

< p > 致谢:以利亚·纽伦
署名:Phil hoord

'git tag -d'(man)接受一个或多个标签引用来删除,但每次删除都是通过在每个argv上调用delete_ref来完成的。
这是非常缓慢的时候,从填充裁判。
使用delete_refs代替,这样所有的删除都可以在单个事务中完成,并进行单个更新

对'git branch -d'(man)执行同样的操作。

由于delete_refs在单个事务中执行所有的打包引用删除操作,如果任何删除失败,那么所有删除都将被跳过。
实际上,它们都不应该失败,因为我们在调用delete_refs之前验证了每一个的哈希值,但在此更改之后,一些网络错误或奇怪的权限问题可能会产生不同的结果

此外,由于文件支持的删除不是在同一个事务中执行的,因此即使打包-refs事务失败,这些删除也可能成功。

在删除分支之后,只有在分支引用被删除并且随后没有添加回来的情况下,才删除分支配置。

使用delete_ref手动测试删除24000个标签需要大约30分钟。
使用delete_refs将花费大约5秒的时间

这里有一个一般的解决方案:

git branch | grep "<pattern>" | xargs git branch -D

我建议在执行上述命令之前运行以下命令行,预览将要删除的分支。

git branch | grep "<pattern>"

在这种情况下

git branch | grep "^3\.2\..*" | xargs git branch -D

< / >强博士<强> TL;

git branch -D $(git branch | grep '3\.2\..*')

解释

  1. git branch列出了本地系统上的所有分支。
  2. grep '3\.2\..*'使用模式匹配来查找当前工作目录中以3.2.开头的所有文件。使用\转义.,因为它是grep的特殊字符。
  3. git branch | grep '3\.2\..*'将所有github分支名称传递给grep命令,然后grep命令将在提供的列表中查找以字符串开头的分支名称。
  4. $(git branch | grep '3\.2\..*')任何包含在$()中的内容都将作为单独的shell命令运行,其结果可以传递给单独的命令。在本例中,我们想要删除的文件列表。
  5. git branch -D $(git branch | grep '3\.2\..*')这只是做了上面第4点解释的事情。

我的具体情况没有解决,所以我重新回答…

场景:

  • 新克隆的回购
  • 未创建本地分支
  • 许多远程分支(在我的例子中超过100个)
  • 我想从远程删除所有的特性分支feature/myfeature

这是我在工作中得到的命令:

git branch  -a | cut -c3- | grep 'origin\/feature' | sed 's/remotes\/origin\///' | xargs git push origin --delete

感谢@gwai让我走上正轨。