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

时间:2010-09-08 17:28:26

标签: git

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

我希望以偷偷摸摸的方式立刻删除它们中的很多。由于他们大多遵循点发布惯例,我想也许有一条捷径可以说:

git branch -D 3.2.*

并杀死所有3.2.x分支。

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

30 个答案:

答案 0 :(得分:305)

没有那种语法。但你可以这样做:

git branch -D 3.2 3.2.1 3.2.2

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

git branch -D `git branch | grep -E '^3\.2\..*'`

答案 1 :(得分:130)

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和Jefromi建议),因为git branch输出不适用于脚本:

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\*`

答案 2 :(得分:121)

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

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

答案 3 :(得分:74)

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

一个班轮示例:

async

答案 4 :(得分:36)

最近,我正在寻找同样问题的解决方案,最后我找到了一个答案并且它运作良好:

  1. 打开终端或同等设备。
  2. 输入git branch | grep"模式"预览分支机构 这将被删除。
  3. 输入git branch | grep"模式" | xargs git branch -D
  4. 这个解决方案很棒,如果你想要完整解释每个命令及其工作方式,那么它的给定here

答案 5 :(得分:25)

使用

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

答案 6 :(得分:23)

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

打开终端或等效终端,然后键入以下命令:

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

仅此而已!

你很好!

答案 7 :(得分:8)

也许您会发现这很有用:

如果要删除所有非“ master”,“ foo”和“ bar”之类的分支

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

grep -v'something'是具有反转功能的匹配器。

答案 8 :(得分:6)

如果您要删除多个分支进行清理,则可以使用

 git branch -d branch1 branch2 branch3

如果您想向远程反映删除操作,也可以使用此按钮将其推送

 git push origin --delete branch1 branch2 branch3

答案 9 :(得分:5)

如果您不仅限于使用git命令提示符,则可以始终运行git gui并使用Branch-&gt; Delete菜单项。选择要删除的所有分支并将其翻录。

答案 10 :(得分:5)

我根据@gawi(上面)提供的答案制作了一个可能有用的小功能。

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

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

removeBranchesWithPrefix somePrefix

注意

我目前正在设置软删除,这意味着它不会删除分支,除非它们已经合并。如果您想生活在边缘,请将-d更改为-D,无论如何都会删除带有前缀的所有内容!

答案 11 :(得分:3)

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

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.

答案 12 :(得分:3)

如果您正在运行Windows,则可以使用Power Shell一次删除多个分支...

for _, value := range target

此命令将删除所有包含“ feature-”作为子字符串的分支。

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

答案 13 :(得分:3)

对于在这里使用PowerShell的纯灵魂小脚本 git branch -d $(git branch --list '3.2.*' | %{$_.Trim() })

答案 14 :(得分:1)

它对我来说正常工作:

git branch | xargs git branch -d

git branch | xargs git branch -D

删除所有本地分支机构

答案 15 :(得分:1)

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

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

答案 16 :(得分:1)

出于这个确切的原因,我将缩写和短划线(-)用作分支名称的前三个字符:

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

答案 17 :(得分:1)

保留“开发”并删除本地所有其他

    git branch | grep -v "develop" | xargs git branch -D 

答案 18 :(得分:1)

如果要在文本文件(branches-to-del.txt)中删除所有分支(每行一个分支),则可以这样做以从远程(来源)删除所有这些分支: xargs -a branches-to-del.txt git push --delete origin

答案 19 :(得分:0)

您可以使用git gui一次删除多个分支。 从命令提示符/ Bash - &gt; git gui - &gt;远程 - &gt;删除分支... - &gt;选择要删除的远程分支 - &gt;删除。

答案 20 :(得分:0)

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

答案 21 :(得分:0)

今天我刚刚清理了一大堆陈旧的本地/远程分支机构。

下面是我的操作方式:

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 ”之类的文件相比,此文件的运行速度和可靠性要高得多。

这可能不是其他答案中列出的最聪明的方法,但是这种方法非常简单易用。

答案 22 :(得分:0)

如果您已安装Git GUI(这是Windows的默认加载项),则它是最简单的。您可以使用ctrl选择多个分支并一键删除。

答案 23 :(得分:0)

如果您使用的是Fish shell,则可以利用string functions

GOOGLE_SERVICE_INFO_PLIST_FROM="${PROJECT_DIR}/%YOUR_CUSTOM_PATH_TO_FOLDER%/${GOOGLE_SERVICE_INFO_PLIST_NAME}"
BUILD_APP_DIR="${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}"
GOOGLE_SERVICE_INFO_PLIST_TO="${BUILD_APP_DIR}/GoogleService-Info.plist"
cp "${GOOGLE_SERVICE_INFO_PLIST_FROM}" "${GOOGLE_SERVICE_INFO_PLIST_TO}" 

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

答案 24 :(得分:0)

我在Windows上,您可以使用powershell来执行此操作:

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

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

答案 25 :(得分:0)

git branch -d branch1 branch2 branch3 已经可以使用,但使用 Git 2.31(2021 年第一季度)会更快。
以前,当删除许多分支和标签时,代码曾经一次执行一个引用。
还有另一个 API 可以用来删除多个引用,当引用被打包时,它会产生很大的性能差异。

请参阅 commit 8198907Phil Hord (phord)(2021 年 1 月 20 日)。
(由 Junio C Hamano -- gitster --commit f6ef8ba 合并,2021 年 2 月 5 日)

<块引用>

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

确认:以利亚纽伦
签字人:Phil Hord

<块引用>

'git tag -d'(man) 接受一个或多个要删除的标签引用,但每次删除都是通过在每个 {{1} 上调用 delete_ref 来完成的}}.
从打包的引用中删除时,这非常慢。
改用 argv,这样所有的删除都可以在一个事务中通过一次更新完成。

对“git branch -d”执行相同的操作(man)

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

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

删除分支后,仅当分支引用被删除并且随后没有重新添加时才删除分支配置。

使用 delete_refs 手动测试删除 24,000 个标签需要大约 30 分钟。
使用 delete_ref 大约需要 5 秒。

答案 26 :(得分:0)

这是一个通用的解决方案:

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

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

git branch | grep "<pattern>"

在这种情况下

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

答案 27 :(得分:-1)

和Git一样,所有的分支都没有引用git repo,你为什么不删除转到.git/ref的分支,然后如果遗漏任何东西,那么存储库中没有任何意义就会自动删除垃圾收集,所以你不需要打扰。

答案 28 :(得分:-2)

git branch -D <branchName>

答案 29 :(得分:-4)

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

AbsoluteLayout