在git中删除多个远程分支

Jak*_*ith 114 git bash

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

nee*_*vek 133

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

git branch -r | awk -F/ '/\/PREFIX/{print $2}' | xargs -I {} git push origin :{}
Run Code Online (Sandbox Code Playgroud)

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

git branch -r | awk -F/ '/\/PREFIX/{print $2}'
Run Code Online (Sandbox Code Playgroud)

  • 如果您的分支名称中有/(如果您使用的是git-flow或其他内容),请打印{$ 2"/"$ 3}而不是 (23认同)
  • 我喜欢这个,因为它是一个班轮,我可以先做一个干运行.不幸的是,它出错了这条消息:`$ git branch -r | awk -F /'/\/ APR/{print $ 2}'| xargs -I {} git push origin:{}错误:无法推送到不合格的目的地:APR-04-DPH目的地refspec既不匹配遥控器上的现有引用也不以refs /开头,我们无法猜测前缀基于源参考.错误:未能将某些引用推送到'GIT_URL' (2认同)
  • 我在Windows中使用msysgit,下面的命令对我有用(结合@ajma对包含正斜杠的分支名称的注释:`git branch -r | awk -F /'/ \ / PREFIX / {print $ 2“ /” $ 3}'| xargs -I%git push origin --delete%` (2认同)

小智 88

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

git push origin --delete <branch1> <branch2> <branch3>
Run Code Online (Sandbox Code Playgroud)

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

  • 我最终使用`git branch -r | awk -F /'/\/ PATTERN/{print $ 2}'| xargs git push origin --delete` (5认同)

Dmi*_*riy 31

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

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

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

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}' | xargs -I {} git push origin :{}
Run Code Online (Sandbox Code Playgroud)

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

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}'
Run Code Online (Sandbox Code Playgroud)

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

cat your_file.txt | xargs -I {} git push origin :{}
Run Code Online (Sandbox Code Playgroud)

  • 使用`xargs -a file -L` 代替`cat file | xargs`。更简单的`xargs -a file git push --delete origin`。 (2认同)

Kir*_*rby 13

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

branch -r节目origin/prefix/branchname.所以它需要prefix/branchname.

  • @jojo,据我所知,对于“-i”,它使用“{}”的默认替换,但使用“-I”,您可以声明自己的替换。...刚刚在手册中找到:`-i ...与-I{}相同` (2认同)

lac*_*ack 10

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

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

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}'
Run Code Online (Sandbox Code Playgroud)

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

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}' | xargs git push origin
Run Code Online (Sandbox Code Playgroud)

  • 当你有一个较低版本的bash或使用windows版本git bash时,它不能使用xargs的"-I"选项. (2认同)

Ash*_*wan 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
Run Code Online (Sandbox Code Playgroud)


Nar*_*ren 8

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

  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'feature /.*'| xargs -I {} git push origin:{}

  • 我认为您打算在步骤5中逃避反引号 (2认同)

voi*_*ter 6

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

$ git branch -r --list 'fork/*' | sed 's/fork\///' | xargs git push --delete fork
Run Code Online (Sandbox Code Playgroud)

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


小智 6

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

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

然后选择你想要的分支:

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


小智 5

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

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2 "/" $3}' | xargs -I {} git push origin :{}
Run Code Online (Sandbox Code Playgroud)

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


and*_*.in 5

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

史蒂夫(Steve)的解决方案对我做了一点点调整。我的遥控器已命名,origin/feature/some-feature-name因此我修剪了您的awk

git branch -r | awk -Forigin/ '/\/feature/ {print $2 $3}' | xargs -I {} git push origin :{}
Run Code Online (Sandbox Code Playgroud)

现在正在执行一个不错的删除流程:

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
Run Code Online (Sandbox Code Playgroud)

但是,我想知道是否有人对更优雅的解决方案有任何想法,可能会输出如下内容(我的CLI脚本非常差,所以我需要花点时间来弄清楚):

git push origin :feature/search-min-chars :feature/search-placeholder :feature/server-error-message :feature/six-point-asterisk
Run Code Online (Sandbox Code Playgroud)

这将产生一个网络请求的单个输出:

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
Run Code Online (Sandbox Code Playgroud)