我有一个团队成员无意中将他的 150 多个本地分支机构推到了我们的中央仓库。值得庆幸的是,它们都有相同的前缀。使用该前缀,是否有一个我可以使用的 git 命令或很酷的小 shell 脚本可以一次删除所有这些?
18 回答
使用以下命令删除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提供出色而优雅的解决方案!
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 :{}
这可能是一个重复的答案,但经过测试并完美地为我工作。
- 强行删除本地分支
git 分支 -D 分支名称
- 删除远程分支
git push origin --delete 分支名称
- 删除超过 1 个本地分支
git 分支 -D 分支名称1 分支名称2
- 删除超过 1 个远程分支
git push origin --delete 分支名称1 分支名称2
- 删除带前缀的本地分支。例如,特征/*
git branch -D $(git branch --list 'feature/*')
git branch -D backticks $(git branch --list 'feature/*' backticks )
- 列出带有前缀的远程分支。
git 分支 -r | grep -Eo '特征/.*'
- 删除带前缀的远程分支
git 分支 -r | grep -Eo '特征/.*' | xargs -I {} git push origin :{}
与 grep: 相同
git branch -r | grep -Eo 'PREFIX/.*' | xargs -i git push origin :{}
。
branch -r
显示origin/prefix/branchname
。所以需要prefix/branchname
。
Neevek 的解决方案很优雅,但它可以更好:提议的解决方案在每个分支调用一次“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
资源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,我找到了一个非常适合我的解决方案,我认为值得分享:
史蒂夫的解决方案对我有用,只需稍作调整。我的遥控器被命名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
感谢尼维克。在为我的目的重新配置它之后效果很好:
git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2 "/" $3}' | xargs -I {} git push origin :{}
我还需要考虑文件夹结构。我的功能分支位于像 origin/feature/PREFIX-FEATURENUMBER 这样的文件夹结构中。所以我必须从 $2=folder + $3= branchname 建立我的模式。
每个人都在使用awk
,不知道为什么。我觉得这更复杂。这是我用来删除遥控器上所有远程分支的方法fork
:
$ git branch -r --list 'fork/*' | sed 's/fork\///' | xargs git push --delete fork
如果您需要将列表过滤到仅远程分支的子集,请在和grep
之间添加一个。xargs
sed
我意识到这是针对 git 命令的,但是如果您正在寻找替代解决方案来执行类似或相同的结果:
你可以从这里做(Git Remove Remote Branches):
然后选择你想要的分支:
确保您有权删除远程分支。
我无法使用 awk,因为我们使用斜杠结构作为分支名称。
git branch -r | grep "origin/users/YOURNAME" | sed -r 's/^.{9}//'| xargs -i sh -c 'git push origin --delete {}'
这将获取所有远程分支,仅获取单个用户的一个,远程“origin/”字符串并在每个分支上执行删除。
Github 还有一个不错的 UI 和快速删除分支的机制,如果你更愿意使用 UI
试运行:
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
以前的答案帮助我删除了 2018 年的所有发布分支。我在 Windows 10 命令提示符下运行了这个。我已经安装了clink,所以类似 Linux 的命令对我有用。
空跑:
git branch -a | grep -o "release-.*2018" | xargs -I {} echo {}
如果空运行显示不在远程/源中的分支。运行以下 git prune 命令进行修复并再次检查。
git remote prune origin
对上述结果满意后删除:
git branch -a | grep -o "release-.*2018" | xargs -I {} git push origin --delete {}
如果你看到:error: unable to delete 'release-...2018': remote ref does not exist
。然后运行之前的 prune 命令并重试。
我试图删除所有 origin/release/r1-1* 远程分支,因此以下命令行运行良好。
git branch -r | awk -Forigin/ '/\/*r1-1/ {print $2}' | xargs -I {} git push origin :{}
如果我们可以找到几个 PREFIX 组合的多个遥控器,这是一个很好的解决方案。如果您有许多(比如说数百个)自动创建的分支,例如这样的模式:build/XXXX
. 此外,还有upstream
remote 和forkorigin
以便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 {}
我不时使用它来删除远程中不需要的分支:
git branch -r --list origin/some/prefix/* | sed 's/origin\///' | xargs git push origin --delete
其中以 some/prefix 开头的 brnaches 是不需要的。
这:
- 处理名称中带有(多个)的分支,
/
并且 - 更新远程分支列表(
git remote update origin --prune
运行后不需要)
例子:
git branch -r --list origin/bug/* | sed 's/origin\///' | xargs git push origin --delete
删除所有以 'bug/' 开头的分支