从远程删除大量分支

4

我有一个包含1000个分支的Git远程仓库,我想删除所有名称foo_开头的分支。有没有简单的方法可以实现这一目标?

3个回答

5

简短回答

如果你的远程仓库被称为“origin”,运行以下命令:

git for-each-ref --format='%(refname:strip=3)' refs/remotes/origin/* | \
  grep -v '^foo_\|^HEAD$' | \
  xargs git push --delete origin

更多细节

推荐使用git for-each-ref而不是git branch

其他答案建议将git branch的输出导入到grepawk中。然而,这种方法很脆弱:git branch是一种瓷器(即高级)命令,其输出可能会在未来的Git版本中发生变化。更好的选择是使用git for-each-ref,这是一个功能强大的管道(即低级)命令。

命令说明

(注意:以下假设你的远程分支名为“origin”。)

使用git for-each-ref以适当的格式列出所有位于origin上的远程分支:

git for-each-ref --format='%(refname:strip=3)' refs/remotes/origin/*

将输出导向管道
grep -v '^foo_\|HEAD$'

要丢弃HEAD和所有名称以“foo_”开头的分支。最后,将输出导向

xargs git push --delete origin

一次性删除所有与origin相关的远程分支。

注意:当远程分支的名称不以"foo_" 开头时,上述命令将无法删除当前分支


1
几乎正确,除了我说要删除所有不以foo开头的分支。但是我很欣赏使用for-each-ref,看起来更好。 - Ram Rachum
1
@RamRachum 哎呀!我应该认真读完你的答案。我会相应地修改答案。 - jub0bs
谢谢!你能解释一下为什么在你之前的回答中使用的 * 没有被 bash 自动展开,然后再被 git 命令处理吗?(只是好奇) - Ram Rachum
@RamRachum,我不确定你指的是什么。在被Git处理之前,我所拥有的*已经被Bash扩展了... - jub0bs
除非我在.git文件夹内部,否则Bash如何扩展*?因为存储库根目录中没有refs文件夹。 - Ram Rachum
显示剩余2条评论

2
请使用以下命令在远程服务器上删除所有具有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>

以下是您需要了解的信息:

1 - 列出所有远程分支:

 $ git branch -r

2 - 通过一些正则表达式筛选分支。在这种情况下,我们希望删除任何具有“feature-”前缀的分支:

 $ git branch -r | awk -F/ '/\/feature-/{print $2}'

3 - 将最后一个命令管道传输到 git push 命令中以删除它们:

$ git branch -r | awk -F/ '/\/feature-/{print $2}' | xargs -I {} git push origin :{}

4 - 移除对这些分支的任何本地引用:

$ git remote prune origin

这看起来可能需要很长时间,因为要在网络上进行1000次git推送。最好先用分支名称填充变量,然后再进行一次推送,不是吗? - Jeff Puckett
那可能是一个改进的可能性。顺便问一下,你已经尝试过这种方法了吗? - Chhabilal

1
你应该能够使用以下命令列出所有不以 foo_ 开头的远程分支:
git branch -l -r|grep -v 'origin/foo_'

如果确认可以删除,您可以使用xargs将输出重定向到git push origin --delete命令:
git branch -l -r|grep -v 'origin/foo_'|xargs git push origin --delete

你的 xargs git 命令不需要额外的 -r 标志来删除远程分支吗? - Wim Mostmans
这会在不先从远程获取的情况下工作吗? - Jeff Puckett
@WimMostmans,我已经更新了它,使用git push origin --delete,正如官方文档所述。 - Oldskool

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