141

我有一个团队成员无意中将他的 150 多个本地分支机构推到了我们的中央仓库。值得庆幸的是,它们都有相同的前缀。使用该前缀,是否有一个我可以使用的 git 命令或很酷的小 shell 脚本可以一次删除所有这些?

4

18 回答 18

171

使用以下命令删除PREFIX远程服务器上所有带前缀的分支。

git branch -r | awk -F/ '/\/PREFIX/{print $2}' | xargs -I {} git push origin :{}

您可能需要先进行试运行,看看是否是您要删除的分支:

git branch -r | awk -F/ '/\/PREFIX/{print $2}'
于 2012-05-11T16:36:23.890 回答
109

如果您喜欢更简单的方法,例如删除 3 或 4 个分支:

git push origin --delete <branch1> <branch2> <branch3>

重要提示:仅适用于Git v1.7.0及更高版本。

于 2013-12-09T20:46:47.697 回答
44

感谢Neevek提供出色而优雅的解决方案!

awk但是由于字段分隔符/-F选项),分支名称中的斜杠(我正在使用Git Flow)有一些麻烦

所以我的解决方案是基于Neevek 的,但正确地用 . 解析分支名称/。在这种情况下,我假设您的遥控器调用了origin. 用于删除名称以 开头的远程分支的命令PATTERN

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}' | xargs -I {} git push origin :{}

并且不要忘记检查您要删除的内容:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}'

有用的提示:如果您的分支名称(不带origin/前缀)存储在文本文件中(每行一个分支名称),只需运行:

cat your_file.txt | xargs -I {} git push origin :{}
于 2012-12-20T14:12:14.343 回答
31

这可能是一个重复的答案,但经过测试并完美地为我工作。

  1. 强行删除本地分支

git 分支 -D 分支名称

  1. 删除远程分支

git push origin --delete 分支名称

  1. 删除超过 1 个本地分支

git 分支 -D 分支名称1 分支名称2

  1. 删除超过 1 个远程分支

git push origin --delete 分支名称1 分支名称2

  1. 删除带前缀的本地分支。例如,特征/*

git branch -D $(git branch --list 'feature/*')

git branch -D backticks $(git branch --list 'feature/*' backticks )

  1. 列出带有前缀的远程分支。

git 分支 -r | grep -Eo '特征/.*'

  1. 删除带前缀的远程分支

git 分支 -r | grep -Eo '特征/.*' | xargs -I {} git push origin :{}

于 2019-02-14T19:33:24.963 回答
15

与 grep: 相同 git branch -r | grep -Eo 'PREFIX/.*' | xargs -i git push origin :{}

branch -r显示origin/prefix/branchname。所以需要prefix/branchname

于 2015-06-03T11:51:43.637 回答
10

Neevek 的解决方案很优雅,但它可以更好:提议的解决方案在每个分支调用一次“git push”,这意味着要删除每个分支的额外网络往返。既然您无论如何都在使用 awk,为什么不使用它作为前缀 ':' 然后 xargs 可以只调用一次 'git push' 并一次删除所有分支:

试运行以列出将被删除的分支:

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}'

实际推送删除的最终解决方案:

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}' | xargs git push origin
于 2014-01-30T15:00:58.320 回答
9

资源https://coderwall.com/p/eis0ba

    1 - List all your remote branches:

    $ git branch -r

    2 - Filter the branches by some regular expression. In this case I'm interested in deleting any branch with the 'feature-' prefix:

    $ git branch -r | awk -F/ '/\/feature-/{print $2}'
    3 - Pipe the last command to git push to delete them:
    # **Edit** - Removed extra colon, which is not needed
    $ git branch -r | awk -F/ '/\/feature-/{print $2}' | xargs -I {} git push origin {}
    4 - Grab a beer.

    5 - Remove any local reference to those branches:

    $ git remote prune origin
于 2014-06-09T10:56:53.300 回答
6

感谢 Steve 和 Neevek,我找到了一个非常适合我的解决方案,我认为值得分享:

史蒂夫的解决方案对我有用,只需稍作调整。我的遥控器被命名origin/feature/some-feature-name了,所以我修剪了你的awk

git branch -r | awk -Forigin/ '/\/feature/ {print $2 $3}' | xargs -I {} git push origin :{}

它现在正在做一个很好的小删除流程:

To github.com:project/project-name.git
- [deleted]         feature/search-min-chars
To github.com:project/project-name.git
- [deleted]         feature/search-placeholder
To github.com:project/project-name.git
- [deleted]         feature/server-error-message
To github.com:project/project-name.git
- [deleted]         feature/six-point-asterisk

不过,想知道是否有人对更优雅的解决方案有任何想法,可能会输出类似这样的内容(我的 CLI 脚本非常糟糕,所以我需要一段时间才能弄清楚):

git push origin :feature/search-min-chars :feature/search-placeholder :feature/server-error-message :feature/six-point-asterisk

这将通过一个网络请求产生一个很好的单一输出:

To github.com:project/project-name.git
- [deleted]         feature/search-min-chars
- [deleted]         feature/search-placeholder
- [deleted]         feature/server-error-message
- [deleted]         feature/six-point-asterisk
于 2017-05-23T20:55:18.373 回答
5

感谢尼维克。在为我的目的重新配置它之后效果很好:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2 "/" $3}' | xargs -I {} git push origin :{}

我还需要考虑文件夹结构。我的功能分支位于像 origin/feature/PREFIX-FEATURENUMBER 这样的文件夹结构中。所以我必须从 $2=folder + $3= branchname 建立我的模式。

于 2014-09-04T11:30:34.850 回答
5

每个人都在使用awk,不知道为什么。我觉得这更复杂。这是我用来删除遥控器上所有远程分支的方法fork

$ git branch -r --list 'fork/*' | sed 's/fork\///' | xargs git push --delete fork

如果您需要将列表过滤到仅远程分支的子集,请在和grep之间添加一个。xargssed

于 2017-06-09T16:32:26.370 回答
4

我意识到这是针对 git 命令的,但是如果您正在寻找替代解决方案来执行类似或相同的结果:

你可以从这里做(Git Remove Remote Branches):

然后选择你想要的分支:

确保您有权删除远程分支。

于 2018-03-28T16:33:21.577 回答
1

我无法使用 awk,因为我们使用斜杠结构作为分支名称。

git branch -r | grep "origin/users/YOURNAME" | sed -r 's/^.{9}//'| xargs -i  sh -c 'git push origin --delete {}'

这将获取所有远程分支,仅获取单个用户的一个,远程“origin/”字符串并在每个分支上执行删除。

于 2015-01-28T17:13:24.097 回答
1

Github 还有一个不错的 UI 和快速删除分支的机制,如果你更愿意使用 UI

于 2015-09-09T09:06:05.890 回答
1

试运行:

git branch -r --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} echo {}

删除远程分支:

git branch -r --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} git push origin --delete {}

仅删除完全合并的远程分支:

git branch -r --merged --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} git push origin --delete {}

解释:

sed "s/origin\///"origin/将从分支名称中删除。在没有剥离它的情况下,我得到了:remote ref does not exist

于 2020-01-09T13:31:13.463 回答
1

以前的答案帮助我删除了 2018 年的所有发布分支。我在 Windows 10 命令提示符下运行了这个。我已经安装了clink,所以类似 Linux 的命令对我有用。

空跑:

git branch -a | grep -o "release-.*2018" | xargs -I {} echo {}

如果空运行显示不在远程/源中的分支。运行以下 git prune 命令进行修复并再次检查。

git remote prune origin

对上述结果满意后删除:

git branch -a | grep -o "release-.*2018" | xargs -I {} git push origin --delete {}

如果你看到:error: unable to delete 'release-...2018': remote ref does not exist。然后运行之前的 prune 命令并重试。

于 2020-03-13T00:30:38.393 回答
0

我试图删除所有 origin/release/r1-1* 远程分支,因此以下命令行运行良好。

git branch -r | awk -Forigin/ '/\/*r1-1/ {print $2}' |  xargs -I {} git push origin :{}
于 2014-03-27T17:53:20.447 回答
0

如果我们可以找到几个 PREFIX 组合的多个遥控器,这是一个很好的解决方案。如果您有许多(比如说数百个)自动创建的分支,例如这样的模式:build/XXXX. 此外,还有upstreamremote 和forkorigin以便branch -r返回origin/build/XXXXupstream/build/XXXX

您可以使用cut -f2- -d/更多命令解决方案:https ://unix.stackexchange.com/a/354984

试运行,可以结合安全的正则表达式模式,例如:33[1-3][0-9][0-9]{4}

git branch -r | grep -Eo "upstream/build/33[0-9][0-9]" | cut -f2- -d/ | xargs -I {} echo {}

与上游的实际删除相同:

git branch -r | grep -Eo "upstream/build/33[0-9][0-9]" | cut -f2- -d/ | xargs -I {} git push upstream --delete {}
于 2020-08-28T14:41:43.790 回答
0

我不时使用它来删除远程中不需要的分支:

git branch -r --list origin/some/prefix/* | sed 's/origin\///' | xargs git push origin --delete

其中以 some/prefix 开头的 brnaches 是不需要的。

这:

  • 处理名称中带有(多个)的分支,/并且
  • 更新远程分支列表(git remote update origin --prune运行后不需要)

例子:

git branch -r --list origin/bug/* | sed 's/origin\///' | xargs git push origin --delete

删除所有以 'bug/' 开头的分支

在此处输入图像描述

于 2022-02-16T02:25:30.667 回答