在git中删除多个远程分支

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

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

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

您可能需要首先进行干运行,看看它是否是您想要删除的分支:

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

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

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

重要提示:只适用于Git v1.7.0及以上版本。

感谢Neevek伟大而优雅的解决scheme!

但我有一些分支名称(我使用Gitstream)的斜线麻烦,因为awk字段分隔符/ (- -F选项)

所以我的解决scheme是基于Neevek的 ,但正确parsing分支名称/ 。 在这种情况下,我假定你的远程调用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 :{} 

Neevek的解决scheme是优雅的,但它可以更好:所提出的解决scheme每分支调用一次“git push”,这意味着每个分支的额外networking往返行程将被删除。 既然你使用的是awk,为什么不用它作为':'的前缀呢,然后xargs可以一次调用'git push'并且一次删除所有的分支:

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

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

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

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

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

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

感谢Neevek。 这为我的目的重新configuration后,运作良好:

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

我也需要考虑到文件夹结构。 我的function分支是在像起源/function/ PREFIX-FEATURENUMBER文件夹结构。 所以我不得不从$ 2 =文件夹+ $ 3 = branchnamebuild立我的模式。

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

感谢Steve和Neevek,我发现了一个对我来说工作得很好的解决scheme,我觉得值得分享:

史蒂夫的解决scheme为我工作了一个小调整。 我的遥控器被命名为origin/feature/some-feature-name所以我修剪了你的awk

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

现在正在做一个很好的删除stream程:

 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 

想知道是否有人有一个更优雅的解决scheme,但是,可能会输出这样的东西(我的CLI脚本很差,所以这需要我花一些时间来解决这个问题):

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

这将导致一个很好的单输出与一个networking请求:

 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 

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

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

警告:这将删除所有远程分支。

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

我试图删除所有的起源/释放/ r1-1 *远程分支,因此下面的命令行很好地工作。

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

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

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

这得到所有的远程分支,只有一个用户,远程“origin /”string,并执行每个删除。

Github也有一个很好的用户界面和快速删除分支的机制,这就是如果你想使用一个用户界面

大家都在用awk ,不知道为什么。 我觉得这更复杂。 这是我用来删除我的fork遥控器上的所有远程分支:

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

如果您需要将列表过滤到远程分支的一个子集,则在xargssed之间插入一个grep