我想知道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
是否可以执行相同的操作。
答案 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 fetch
和git push
的上下文中,修剪必须通过多名称复制操作进行。
更具体地说,refspec具有以下形式之一:
source
source:destination
:destination
或以上三个中的任何一个以加号+
为前缀。 source 和 destination 部分可以是master
或v1.2
之类的不合格名称,例如refs/heads/master
或{{1 }},或者-此处允许的规则因Git版本而有所不同-一种全局模式的简化版本,例如refs/tags/v1.2
或refs/heads/*
。 sup> 1
如果您不在参考规范中使用全局变量refs/remotes/origin/*
,则修剪是无稽之谈。
如果您做在参考规范中使用全局变量*
,则修剪的意思是:
如果没有修剪选项,则不会复制未复制的目的地名称。
1 仅使用一个*
,并且仅在其本身或使用带有*
的前缀和/或后缀,才能在所有Git版本中使用。那就是:
/
很好(它是远程+refs/heads/*:refs/remotes/origin/*
的标准参考规范),如下所示:
origin
要将所有来自GitHub存储库的拉取请求复制到您自己的本地存储库中。但是:
+refs/pull/*:refs/heads/prs/*
仅在某些版本的Git中工作。