如何删除名称符合特定模式的分支

75

如何在git中删除以字母“o”开头的分支?

假设我有以下分支列表:

origin_alpha
origin_beta
origin_gamma
alpha
beta
gamma

我想要删除分支 origin_alphaorigin_betaorigin_gamma


我不知道是否有任何限制阻止您像删除其他分支一样删除这些分支: git branch -d origin_alpha - kvdv
2
@kvdv 感谢您的回答。假设我有50个以字母“o”开头的分支,那么手动删除所有这些分支就不方便了。因此,才会有这个问题。 - Nirmalya Ghosh
@cmbuckley 谢谢您的答复。我想要删除那些以特定字母开头的分支。因此,我的问题与您提到的问题不同。 - Nirmalya Ghosh
@NirmalyaGhosh 不是的,它们是一样的,但匹配模式是 o* 而不是 3.2*。请参考答案 https://dev59.com/DHA65IYBdhLWcg3wuRF8#28614187。 - cmbuckley
将标题更改为类似于“删除与某种模式匹配的git分支”或将来参考更正确的英语内容。 - Jepessen
显示剩余2条评论
5个回答

124
更新:使用xargs-r选项是GNU的附加功能。除非您使用来自GNU findutils的xargs,否则它可能无法正常工作。您可以省略它,但如果输入传输到xargs为空,则会导致错误。
您可以使用git branch --list <pattern>并将其输出导入xargs git branch -d:
git branch --list 'o*' | xargs -r git branch -d

顺便提一下,上面的代码有一个小问题。如果你当前检出的分支以o开头,那么git branch --list 'o*'的输出将会是这样:

* origin_master
origin_test
o_what_a_branch

请注意当前分支名称前面的星号*

虽然您无论如何都不能删除当前分支,但这会导致xargs也将*传递给git branch delete

正如我所说,这只是一个表面上的错误,但如果您想避免它,请使用:

git branch --list 'o*' | sed 's/^* //' | xargs -r git branch -d

如果您正在使用这些分支之一,那么此方法将无法正常工作,因为您的输出将包含突出显示的星号。请参阅答案 https://dev59.com/DHA65IYBdhLWcg3wuRF8#3670560。 - cmbuckley
切换到主分支并应用了这段代码。解决了我的问题。谢谢。 - Nirmalya Ghosh
2
@cmbuckley 如果你正在那个分支上,git branch -d <branch>也不会起作用。 ;) 这就是为什么我忽略了它的原因。 - hek2mgl
13
刚刚在 Mac 上尝试了一下:xargs 不接受 -r 参数(会显示“illegal option -- r”错误信息),但是没有加这个参数也能够满足预期的目的。 - Amy Pellegrini
2
FYI,现在在Windows上单引号会导致问题,git branch --list 'hotfix' 不会显示任何内容,但是 git branch --list "hotfix" 可以解决问题。 - PandaWood
显示剩余7条评论

48

另一种方式可能是这样的:

git branch -d $(git branch | grep yourSearchPattern)

对我来说,使用grep更直观,因为我每天都在使用它。

您还可以创建一个别名(或任何其他建议的解决方案的别名),例如在此处查看如何将参数传递给别名: http://www.cyberciti.biz/faq/linux-unix-pass-argument-to-alias-command/

附注:在您的特定情况下,yourSearchPattern可能是origin:

git branch -d $(git branch | grep origin)

作为下一步,让删除过程更加详细说明也是很不错的,例如每个分支都需要确认删除,但我认为这超出了问题的范围...


我现在在使用Windows,虽然我有完整的Unix命令集,例如grep,但是你在这里的建议,比如 git branch -d $(git branch | grep hotfix) 失败并显示 error: branch '$(git' not found - PandaWood
乍一看:$() 在 Win 中是否被正确识别?似乎 git 正试图删除分支 $(git 而不是用命令输出替换它。 - lzzluca
很高兴看到对“-d”后的第一行代码的详细说明。 - Eduard

16

git branch -D $(git branch --list 'regex_here')

例子:\
git branch -D $(git branch --list 'aputhen/*')
删除所有名称以aputhen/开头的分支。


7
晚到派对了,但另一种做法是:
git branch -d `git branch | grep substring`

并且对于当前的问题

git branch -d `git branch | grep origin`

这将会删除所有名称中包含 origin 的分支。


6

在PowerShell(Windows)中添加我使用的脚本

Foreach ($branch in (git branch --list | findstr user)) { git branch -D $branch.trim() }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接