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

时间:2019-11-18 15:55:08

标签: git

我想知道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.

但是我对上面的 partnerpart 的含义感到困惑。让我通过一个例子来说明我要做什么。

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

$ 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是文档所指的local counterpart

现在按以下方式删除此本地副本:

$ 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 个答案:

答案 0 :(得分:0)

Git需要知道要比较什么。指定在哪里找到裁判。

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

git push --prune origin refs/heads/*

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

git push origin :my-feature-branch

答案 1 :(得分:0)

我想在EncryptedWatermelon's answer上扩展一下。在git fetchgit push的上下文中,修剪必须通过多名称复制操作进行。

更具体地说,refspec具有以下形式之一:

  • source
  • source:destination
  • :destination

或以上三个中的任何一个以加号+为前缀。 source destination 部分可以是masterv1.2之类的不合格名称,例如refs/heads/master或{{1 }},或者-此处允许的规则因Git版本而有所不同-一种全局模式的简化版本,例如refs/tags/v1.2refs/heads/*。 sup> 1

如果您在参考规范中使用全局变量refs/remotes/origin/*,则修剪是无稽之谈。

如果您在参考规范中使用全局变量*,则修剪的意思是:

  • 将给定的源名称复制到相应的目标名称​​和
  • 删除不是由复制源名称引起的任何匹配的目标名称。

如果没有修剪选项,则不会复制未复制的目的地名称。


1 仅使用一个*,并且仅在其本身或使用带有*的前缀和/或后缀,才能在所有Git版本中使用。那就是:

/

很好(它是远程+refs/heads/*:refs/remotes/origin/* 的标准参考规范),如下所示:

origin

要将所有来自GitHub存储库的拉取请求复制到您自己的本地存储库中。但是:

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

仅在某些版本的Git中工作。