在git中删除多个远程分支


128

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

Answers:


150

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

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

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

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

2
我喜欢它,因为它是一根衬板,我可以先进行空运行。不幸的是,它会因以下消息而出错: $ git branch -r | awk -F/ '/\/APR/{print $2}' | xargs -I {} git push origin :{} error: unable to push to unqualified destination: APR-04-DPH The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to 'GIT_URL'
Jake A. Smith

使用git branch -r | awk -F/ '/\/APR/{print $2}',您是否可以看到列出的所有APR前缀分支名称?
neevek 2012年

1
OK,这是因为APR-04-DPH分支已被删除。看看这些回答的问题:这个这个以及这个。这些问题的答案解决了相同的问题,您可能需要自己测试解决方案。
neevek 2012年

26
如果您的分支名称中有/(如果您使用的是git-flow或其他名称),则改为打印{$ 2“ /” $ 3}
ajma

4
我在Windows中使用msysgit,以下命令为我工作(结合@ajma对分支名称包含正斜杠的注释:git branch -r | awk -F/ '/\/PREFIX/{print $2"/"$3}' | xargs -I % git push origin --delete %
rikoe 2015年

96

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

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

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


6
我最终使用了git branch -r | awk -F/ '/\/PATTERN/{print $2}' | xargs git push origin --delete
Aram Kocharyan

36

感谢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 :{}

2
使用xargs -a file -L代替cat file | xargs。更简单xargs -a file git push --delete origin
musiKk 2015年

15

这可能是重复的答案,但经过测试并非常适合我。

  1. 强制删除本地分支

git branch -D分支名称

  1. 删除远程分支

git push origin-删除分支名称

  1. 删除多个本地分支

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

  1. 删除多个远程分支

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

  1. 删除带有前缀的本地分支。例如,功能/ *

git branch -D $(git branch --list'功能/ *')

git branch -D 反引号 $(git branch --list'feature / *' 反引号

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

git branch -r | grep -Eo'功能/.*'

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

git branch -r | grep -Eo'功能/.*'| xargs -I {} git push origin:{}


2
我认为您的意思是要在第5步中逃避挑衅
GPL

如何添加反引号?
Naren

1
@Naren:问题在于降价格式将您的反引号变成了样式命令。我用另一种命令替换方法替换了它们(例如,“ $(command)”等效于“ command”,但不会被markdown转换为怪异的东西。)您可以做的另一件事是用“ \”转义反引号
稳定狗

13

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

branch -r显示origin/prefix/branchname。因此需要prefix/branchname


我想你的意思xargs -I {} git push origin :{}不是-i
jojo

1
@ jojo,AFAIK,因为-i它使用默认替换项,{}但是-I您可以声明自己的替换项。...仅在手册中找到:-i ... the same as -I{}
Kirby

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

2
当您使用较低版本的bash或使用Windows版本git bash时,不能为xargs使用“ -I”选项时,它可以完美工作。
zchholmes 2015年

我有xargs: replstr may not be emptyNeevek的解决方案,也许是git版本。。git version 1.9.5但这对我很有用。多亏了你们两个
IamFace 2015年

8

资源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

谢谢,这对我有用。在亩情况下,我可以删除多个本地分支。谢谢!
Prashant Kabade

5

多亏了Steve和Neevek,我发现了一个非常适合我的解决方案,我认为值得分享:

史蒂夫(Steve)的解决方案对我做了一点点调整。我的遥控器已命名,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

4

感谢Neevek。在出于我的目的对其进行重新配置后,此方法运行良好:

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

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


4

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

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

扔在一grep之间xargssed如果需要过滤列表下降到仅远程分支机构的一个子集。


1
非常感谢。在所有解决方案中,这实际上对我有用。grep正在返回带有远程名称以及的完整分支origin/blaprefix_anotherbla。但是使用sed处理得很好。这种方法的另一个优点是,我使用bitbucket,并且不需要为每个分支删除手动输入身份验证密码。这确实删除了一个批次中的所有分支。
Madhur Bhaiya,

删除所有绿色git branch -r | egrep 'origin/greenkeeper' | sed 's/origin\///' | xargs -I {} git push origin --delete {}
管理员

4

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

您可以从此处执行此操作(Git删除远程分支):

然后选择所需的分支:

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


这应该是一个最佳答案,它与平台无关。
卡明顿

有什么软件,可用于Linux?
abhisekp

1

Github还有一个不错的UI和机制,可以快速删除分支,那就是您宁愿使用UI


1
是的,在此处进行了说明,但是您仍然必须为每个分支单击一次。投票最多的解决方案是执行许多分支的最佳方法,您可以编写可匹配的正则表达式。
thewoolleyman '16

0

我试图删除所有origin / release / r1-1 *远程分支,因此以下命令行可以正常工作。

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

0

我无法使用awk,因为我们在分支的名称中使用了斜杠结构。

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

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


0

空运行:

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


0

先前的答案帮助我从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命令,然后重试。


-4

警告:这将删除所有远程分支。请谨慎使用。

我认为删除远程分支的方式是最好的。

git branch -r | grep -v master | sed 's/origin\//:/'| xargs git push

警告:这将删除所有远程分支。请谨慎使用。


4
被低估为明显的巨魔。如果我有权利,将删除。
杰克·史密斯

您在哪里发现拖钓?
Dmytro Gorpynenko 2014年

2
这是不正确的,您缺少了xargs的一些重要参数,并且它无法回答问题。
罗布

@ JakeA.Smith杰克,我想您认为这段代码将删除远程主服务器-情况并非如此,因为grep -v主服务器会找到主服务器以外的所有内容。
Vadim Samokhin

@Rob这里不正确是什么?最终执行的语句将很像git push:some_branch:another_branch,这是绝对正确的。
Vadim Samokhin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.