即使删除了其上游远程分支,git remote prune origin也不会删除本地分支

sak*_*trp 13 git git-remote git-branch

这是一个常见的用例,我克隆一个存储库,签出一个分支,做一些代码更改,进行多次提交,然后当它稳定时,我做一个推送到远程,最终分支被合并和删除.我离开了一个上游的当地分支机构.

我一直在寻找一种删除所有这些分支的安全方法.从描述来看,似乎git remote prune起源正是这样做的.但它似乎并不适合我.

看到以下行为,分支encrdb_init已被删除remotegit 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
Run Code Online (Sandbox Code Playgroud)

供参考添加输出 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>`
Run Code Online (Sandbox Code Playgroud)

Von*_*onC 11

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

不是当地的分支机构.
通常的做法是仅删除合并的本地分支.

git branch(甚至使用-vv)只显示本地分支.
一个分支可以在其名称中的斜杠

远程跟踪分支位于remotes/origin命名空间中,并记录获取的内容.
上游分支是为了使所述本地分支知道相关联的本地分支远程分支,其中推.

git remote prune正确删除远程跟踪分支,该分支恰好是本地bugfix/encrdb_init 分支的上游分支.
这就是为什么你看到origin/bugfix/encrdb_init: gone:远程跟踪分支已经消失.


OP增加:

从描述来看,它似乎git remote prune origin正是这样做的.但它似乎并不适合我.

不,描述没有提到当地分支机构.

删除所有过时的远程跟踪分支<name>.
这些过时的分支已经从引用的远程存储库中删除<name>,但仍然在" remotes/<name>"中本地可用.

<name>这是git remote -v引用的远程仓库的名称.
通常是" origin".
git remote prune将删除注册的分支remotes/origin(不是"远程").它不会删除本地分支.

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

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

  • 我更喜欢使用git branch -d而不是-D,以便只删除已经合并的分支.
  • 你最终可能会删除带有提交消息的分支,其中包含字符串" : gone"

一个更好的办法来列出这些分支是:

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