Git删除远程分支:远程引用不存在。

117

简而言之;

  • 如何删除远程多个已合并的远程分支?

更多背景信息;

我有一个带有多个已合并为主分支的Git存储库。 我可以使用以下命令逐个删除这些远程分支:

git push --delete origin myBranch-1234

然而,对于所有的遥控器来说,这是一个缓慢而繁琐的过程。因此,我正在尝试使用以下命令:

git branch -r --merged | grep origin | grep -v master | xargs git push origin --delete

git branch -r --merged列出所有已合并的远程分支。
grep origin告诉命令将包括origin。
grep -v master告诉命令排除master。
xargs git push origin --delete告诉命令删除这些远程分支。

综上所述,我希望运行此命令可以收集所有已合并的远程分支并将它们删除。

当我运行上述命令时,我会为每个已合并的远程分支接收到以下输出:

error: unable to delete 'origin/myBranch-1234': remote ref does not exist
error: unable to delete 'origin/myBranch-1235': remote ref does not exist
error: unable to delete 'origin/myBranch-1236': remote ref does not exist
error: unable to delete 'origin/myBranch-1237': remote ref does not exist
... etc

然而这些远程仓库确实存在,我可以查看每一个。许多网站和人都建议我运行git fetch --prune来清除丢失的引用,但由于所有这些远程仓库都存在,所以这没用。

所以我想问,亲爱的Stack Exchange;

  • 为什么我可以删除一个远程仓库,但不能删除多个?
  • 我的命令是正确的吗?

我认为我少了一些小东西。每次我研究这个问题时,似乎我做得很正确,但我却得到了上述错误。

3个回答

244
您可能需要先修剪本地的远程分支“缓存”。尝试运行以下命令:git fetch -p origin,再进行删除操作。

2
那对我解决了问题,谢谢!不过,如果我没有使用 --prune 参数进行获取,为什么它不会更新呢?在我的看法中,这相当具有误导性。 - dave0688
9
对于从搜索中来到这里的人,需要说明一点——虽然这篇文章对于大多数人来说很有用,但在原始问题方面其实是不正确的。原帖的问题是他的命令在分支名称中错误地包含了origin/,这个问题已经在其他答案中得到描述和解决。 - CupawnTae

113

这些分支是从远程(origin)移除的吗?如果是,您可以简单地执行以下操作

git fetch --prune origin
否则,即使在本地删除它们后,它们可能会返回。 更新:再看一下你的命令,似乎构建不正确。你可能想要:
git push origin --delete myBranch-1234

但是你却在做类似于这样的事情

git push origin --delete origin/myBranch-1234

原始分支没有被删除,我可以检出任何一个分支。 - Jqw
1
是的,因为在第二种情况下执行了不同的命令。 - Mykola Gurov
1
我不明白你的观点。我知道我正在使用两个不同的命令。第二种情况是使用 git branch -r --merged 获取所有合并的远程分支,然后尝试使用 xargs git push origin --delete 删除它们。该命令试图删除远程分支,但它认为“远程引用不存在”。 - Jqw
1
在你的第二个管道命令中,将 echo 放在 xargs 旁边,以查看实际执行的内容。 - Mykola Gurov
2
@Jqw,分支名称中不能包含 origin/ 前缀。因为你正在运行 git push origin,所以 git 已经知道你正在使用远程仓库的分支。Mykola 的建议是将命令的最后一部分改为 xargs echo,而不是 echo xargs [...] - Matthew Read
显示剩余2条评论

15

使用sed命令删除 'origin/' 部分并稍微修改一下xargs部分。

git branch -r --merged | grep origin | grep -v -e master | sed s/origin\\/// |  xargs -I{} git push origin --delete {}

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