如何使用git push prune删除远程分支

3
我在想,git push --prune 能否像相反方向的 git remote prune origin 一样清理远程分支。这是文档所说的作用:
--prune
    Remove remote branches that don’t have a local counterpart. For example a remote branch tmp will be removed if a local branch with the same name doesn’t exist any more.

但是我对上面所说的“counterpart”是什么有些困惑。让我通过一个例子来解释一下我的意图。

让我们创建一个远程跟踪分支,如下所示:

$ git checkout -b my-feature-branch && git push -u origin my-feature-branch
...
Branch 'my-feature-branch' set up to track remote branch 'my-feature-branch' from 'origin'.

我的理解是,my-feature-branch 就是文档所指的 本地副本

现在按照以下方式删除这个本地副本:

$ git branch -D my-feature-branch
Deleted branch my-feature-branch (was f7404b0).

如果我运行以下命令git push --prune,我期望它可以删除远程分支:

$ git push --prune origin
Everything up-to-date

但是,即使本地分支已经不存在,git push --prune仍然拒绝删除远程分支。虽然我知道可以使用git push -d origin my-feature-branch来删除远程分支,但是我想了解git push --prune是否也能做到同样的效果。

2个回答

4

Git需要知道要比较什么。请指定参考位置。

git push --prune origin refs/heads/*:refs/heads/*

或者
git push --prune origin refs/heads/*

另一种方法是推送一个空的引用

git push origin :my-feature-branch

2
我想在这里对 EncryptedWatermelon's answer稍作补充。在git fetchgit push的上下文中,修剪必须通过多名称复制操作进行。
更具体地说,refspecs有以下一些形式:
  • source
  • source:destination
  • :destination
请注意保留HTML标签。
或者以上三种中的任何一种前缀加上加号符号“+”。源和目标部分可以是未经限定的名称,例如“master”或“v1.2”,也可以是完全限定的名称,例如“refs/heads/master”或“refs/tags/v1.2”,或者 - 在这里允许的规则略有不同,这是一种类似于“glob模式”的简化变体,例如“refs/heads/*”或“refs/remotes/origin/*”1
如果您在refspec中没有使用glob “*”,那么修剪就毫无意义。
如果您在refspec中使用了glob “*”,那么修剪的意思是实际上:
- 将给定的源名称复制到相应的目标名称,并且 - 删除任何匹配的目标名称,该名称不是复制源名称的结果。
没有修剪选项,未被复制的目标名称将被保留不变。

1只使用一个*,并且仅在前缀和/或后缀中使用,即可在所有Git版本中获得可行的结果。具体而言:

+refs/heads/*:refs/remotes/origin/*

这是合适的(也是远程origin的标准 refspec),还有:

+refs/pull/*:refs/heads/prs/*

将GitHub存储库中的所有拉取请求复制到自己的本地存储库。但是:
+refs/pull/*:refs/heads/pr-*

只在Git的某些版本中有效。


为什么 git push --prune origin refs/heads/* 能够工作,但是 git push --prune origin refs/remotes/origin/* 却不能? - akostadinov
@akostadinov:git push(通常)用于在远程设置分支名称; refs/remotes/origin/*远程跟踪名称。这就是为什么:在origin上的Git以正常方式使用,因此它需要在此处使用分支名称。 - torek

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