【问题标题】:git remote prune origin does not delete the local branch even if its upstream remote branch is deletedgit remote prune origin 不会删除本地分支,即使它的上游远程分支被删除
【发布时间】:2018-07-27 00:00:26
【问题描述】:

这对我来说是一个常见的用例,我克隆一个存储库,签出一个分支,进行一些代码更改,进行多次提交,然后当它稳定时,我推送到远程,最终分支被合并并删除,我只剩下一个本地分支,上游消失了。

我一直在寻找删除所有此类分支的安全方法。从描述来看,git remote prune origin 似乎正是这样做的。但它似乎对我不起作用。

看到以下行为,分支 encrdb_init 已从 remote 中删除,但 git remote prune origin 命令似乎没有修剪它。我不知道为什么。

$ git branch
  bugfix/encrdb_init
  * master
$
$ git remote prune origin
$
$ git checkout bugfix/encrdb_init
  Switched to branch 'bugfix/encrdb_init'
  Your branch is based on 'origin/bugfix/encrdb_init', but the upstream 
  is gone.
  (use "git branch --unset-upstream" to fixup)
$
$ git branch
  bugfix/encrdb_init <<< shouldn't this have been pruned?
  * master

供参考添加git remote show origin的输出

$ git remote show origin
* remote origin
  Fetch URL: <redacted>
  Push  URL: <redacted>
  HEAD branch: master
  Remote branches:
    SSL_test                                                  tracked
    addNodeFix                                                tracked
    autoprefix                                                tracked
    release/1.0.2                                             tracked
  Local branches configured for 'git pull':
    bugfix/encrdb_init          merges with remote bugfix/encrdb_init
    master                      merges with remote master
    release/1.0.2               merges with remote release/1.0.2
  Local refs configured for 'git push':
    master                 pushes to master                 (up to 
date)
    release/1.0.2          pushes to release/1.0.2          (up to 
date)

$ git branch -vv
* bugfix/encrdb_init          341a078c [origin/bugfix/encrdb_init: gone] <redacted comment>`

【问题讨论】:

  • 尝试git remote prune origin --dry-run检查陈旧的分支
  • git remote prune origin --dry-run 输出为空
  • @ShubhamKhatri 它返回空,因为没有更多的远程跟踪分支要删除。 bugfix/encrdb_init 是一个 local (你可以在分支名称中使用斜杠)
  • 您应该会收到带有上述命令的your stale remote-tracking branches 列表。如果您没有收到它,则可能是其他问题

标签: git git-branch git-remote


【解决方案1】:

git remote prune 命令只删除remotes/origin 命名空间中的远程跟踪分支。

不是当地的分支机构。
通常的做法是delete only merged local branches

git 分支(即使使用 -vv)只显示 本地 分支。
一个branch can have a slash in its name

远程跟踪分支位于 remotes/origin 命名空间中,并记录获取的内容。
upstream branch 是与本地分支关联的远程分支,以便所述本地分支知道在哪里推送。

git remote prune 正确删除了远程跟踪分支,该分支恰好是本地 bugfix/encrdb_init 分支的上游分支。
这就是为什么你会看到origin/bugfix/encrdb_init: gone:远程跟踪分支不见了。


OP 补充说:

从描述来看,git remote prune origin 似乎正是这样做的。但它似乎对我不起作用。

不,描述中没有提到本地分支机构。

删除&lt;name&gt; 下所有过时的远程跟踪分支。
这些陈旧的分支已从&lt;name&gt; 引用的远程存储库中删除,但仍可在本地“remotes/&lt;name&gt;”中使用。

&lt;name&gt; 这里是 git remote -v 引用的 remote repo 的名称。
通常 "origin".
git remote prune 将删除在remotes/origin 中注册的分支(而不是“remote(s)”)。它不会删除本地分支。

要“安全地”删除本地分支,您应该:

最后一个选项是不稳定的:

  • 我更喜欢使用 git branch -d 而不是 -D,以便仅删除已合并的分支。
  • 您最终可能会删除包含字符串“: gone”的提交消息的分支

better way to list those branches is:

git branch --list --format "%(if:equals=[gone])%(upstream:track)%(then)%(refname)%(end)"

【讨论】:

  • OP 正在尝试git remote prune origin,它应该从本地删除陈旧的分支,您的回答没有回答问题
  • 是的,分支bugfix/encrdb_init已经被合并到master并远程删除了,但是git并没有删除。
  • @saketrp 我的答案是: git remote prune 不会删除本地分支。 bugfix/encrdb_init 是本地分支。
  • @ShubhamKhatri 我的答案是正确的。
  • 不是跟踪分支吗?从git remote show origin的输出可以明显看出@
猜你喜欢
  • 2016-10-06
  • 2016-07-08
  • 2021-08-22
  • 1970-01-01
  • 2018-09-29
  • 2014-06-09
  • 2020-11-13
  • 2021-12-11
  • 2011-01-01
相关资源
最近更新 更多