在git中删除多个远程分支

时间:2012-05-11 16:22:38

标签: git bash

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

18 个答案:

答案 0 :(得分:120)

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

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

你可能想先做一个干运行,看看它是否是你要删除的分支:

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

答案 1 :(得分:79)

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

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

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

答案 2 :(得分:28)

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

答案 3 :(得分:11)

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

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

答案 4 :(得分:8)

Neevek的解决方案很优雅,但它可以更好:建议的解决方案每个分支调用一次'git push',这意味着要删除每个分支的额外网络往返。既然你还在使用awk,为什么不用它来加上':'前缀,然后xargs可以只调用'git push'一次并立即删除所有分支:

Dry-run列出要删除的分支:

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

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

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

答案 5 :(得分:7)

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

答案 6 :(得分:4)

感谢Neevek。在为我的目的重新配置之后,这很有效:

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

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

答案 7 :(得分:4)

感谢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

答案 8 :(得分:3)

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

  1. 强行删除本地分支机构
  

git branch -D分支名称

  1. 删除远程分支
  

git push origin-删除分支名称

  1. 删除多个本地分支机构
  

git branch -D branch-name1 branch-name2

  1. 删除多个远程分支
  

git push origin-删除分支名称1分支名称2

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

git branch -D git branch --list 'feature/*'

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

git branch -r | grep -Eo'feature /.*'

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

git branch -r | grep -Eo'feature /.*'| xargs -I {} git push起源   :{}

答案 9 :(得分:2)

每个人都在使用awk,不知道为什么。我觉得这样比较复杂。以下是我用来删除fork遥控器上所有远程分支的内容:

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

如果您需要将列表过滤到只有一部分远程分支,请在grepxargs之间加sed

答案 10 :(得分:2)

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

你可以从这里开始(Git删除远程分支):

然后选择您想要的分支:

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

答案 11 :(得分:1)

Github还有一个很好的用户界面和快速删除分支的机制,如果您更愿意使用UI

答案 12 :(得分:0)

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

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

答案 13 :(得分:0)

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

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

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

答案 14 :(得分: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

答案 15 :(得分:0)

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

空运行:

convert()

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

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

对上述结果满意后删除:

git remote prune origin

如果看到:git branch -a | grep -o "release-.*2018" | xargs -I {} git push origin --delete {} 。然后运行前面的prune命令,然后重试。

答案 16 :(得分:0)

在有多个遥控器的情况下,我们可以找到很少的PREFIX组合的好解决方案。 如果您有许多(假设有数百个)分支是自动创建的,例如模式build/XXXX。此外,还有upstream个远程分支origin,因此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 {}

答案 17 :(得分:-3)

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

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

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

  

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