我有一个团队成员,他无意中将150多个当地分支机构推到了我们的中央仓库。值得庆幸的是,它们都具有相同的前缀。使用该前缀,是否有一个我可以使用的git命令或酷的小shell脚本会立即删除所有这些?
答案 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
选项)
所以我的解决方案基于 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)
这可能是重复的答案,但经过测试并非常适合我。
git branch -D分支名称
git push origin-删除分支名称
git branch -D branch-name1 branch-name2
git push origin-删除分支名称1分支名称2
git branch -D
git branch --list 'feature/*'
git branch -r | grep -Eo'feature /.*'
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
如果您需要将列表过滤到只有一部分远程分支,请在grep
和xargs
之间加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/XXXX
和upstream/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