我有一个团队成员无意中将他的 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}'
git push origin --delete <branch1> <branch2> <branch3>
重要提示:本功能仅适用于Git v1.7.0及以上版本。
git branch -r | awk -F/ '/\/PATTERN/{print $2}' | xargs git push origin --delete
。 - Aram Kocharyan感谢 Neevek 提供出色和优雅的解决方案!
但是我在分支名称中遇到了一些斜杠的问题(我正在使用 Git Flow),因为使用 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 :{}
xargs -a file -L
代替 cat file | xargs
。更简单的方式是 xargs -a file git push --delete origin
。 - musiKkgit branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}' | xargs -n 1 -P 8 -I {} git push origin :{}
- DorHugi这可能是一个重复的答案,但以下方法经过测试并且对我完美地起作用。
强制删除本地分支
git branch -D branch-name
删除远程分支
git push origin --delete branch-name
删除多个本地分支
git branch -D branch-name1 branch-name2
删除多个远程分支
git push origin --delete branch-name1 branch-name2
删除带有前缀的本地分支。例如,feature/*
git branch -D $(git branch --list 'feature/*')
列出带有前缀的远程分支。git branch -r | grep -Eo 'feature/.*'
删除具有前缀的远程分支
git branch -r | grep -Eo 'feature/.*' | xargs -I {} git push origin :{}
撤销/还原远程仓库中的最新提交
git reset HEAD^
git push origin +HEAD
feature/
为前缀的分支,可以使用以下命令:git branch -r | grep -Po '(?<=fork/)feature/.*' | xargs -I {} git push fork :{}
。 - Nafiur Rahman Khadem--delete
选项? - mynameistechno--delete
吗? - undefinedgit branch -r | grep -Eo 'PREFIX/.*' | xargs -i git push origin :{}
。
branch -r
显示了 origin/prefix/branchname
。因此它将获取 prefix/branchname
。xargs -I {} git push origin :{}
,而不是 -i
。 - jojo-i
,它使用默认替换{}
,但是对于-I
,您可以声明自己的替换方式。...刚在手册中找到:-i ...
与-I{}
相同。 - KirbyNeevek的解决方案很优雅,但它可以更好:所提出的解决方案每个分支都调用一次'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
git version 1.9.5
但这对我非常有用。感谢你们两个。 - iamfaceresource 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
感谢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
每个人都在使用 awk
,但我不确定为什么。我觉得这更加复杂。以下是我用来删除所有在我的 fork
远程仓库上的分支的命令:
$ git branch -r --list 'fork/*' | sed 's/fork\///' | xargs git push --delete fork
xargs
和sed
之间加入grep
,如果您需要将列表过滤为仅包含一部分远程分支。origin/blaprefix_anotherbla
。但使用 sed
处理得很好。此方法的另一个优点是,我使用的是Bitbucket,我不需要为每个分支删除手动输入认证密码。这个可以一次性删除所有分支。 - Madhur Bhaiyagit branch -r | egrep 'origin/greenkeeper' | sed 's/origin\///' | xargs -I {} git push origin --delete {}
- abhisekpgit gui
来启动。 - trolzensudo apt install git-gui
。顺便说一下,它是git
包的建议之一。 - trolzen
$ 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. SmithAPR-04-DPH
分支已经被删除了。请查看以下已回答的问题:这个、这个和这个。这些问题的答案都解决了同样的问题,您可以自己测试这些解决方案。 - neevekgrep
可以解决问题。git branch -r | grep -Eo 'PREFIX/.*' | xargs -I {} git push origin :{}
branch -r
显示了origin/prefix/branchname
。所以它将采用prefix/branchname
。 - Kirbygit branch -r | awk -F/ '/\/PREFIX/{print $2"/"$3}' | xargs -I % git push origin --delete %
)。 - rikoe