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

git remote prune origin不会删除本地分支,即使其上游远程分支已被删除,git,git-branch,git-remote,Git,Git Branch,Git Remote,这对我来说是一个常见的用例,我克隆一个存储库,签出一个分支,做一些代码更改,进行多次提交,然后在其稳定时,我推送到远程,最终分支被合并和删除。我留下了一家当地的分支机构,上游已经消失了 我正在寻找一种安全的方法来删除所有这样的分支。从描述来看,git remote prune origin似乎正是这样做的。但它似乎对我不起作用 看到以下行为,分支encrdb_init已从remote中删除,但git remote prune origin命令似乎没有对其进行修剪。我不知道为什么 $ git br

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

我正在寻找一种安全的方法来删除所有这样的分支。从描述来看,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
命令仅删除
remotes/origin
命名空间中的远程跟踪分支

不是本地分支机构。
惯常的做法是保持沉默

git分支(即使使用-vv)仅显示本地分支。
A

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

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


OP补充道:

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

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

删除
下所有过时的远程跟踪分支
这些过时的分支已经从
引用的远程存储库中删除,但仍然可以在“
remotes/
”中本地使用

这是git remote-v引用的远程回购协议的名称。
通常为“
原点”

git remote prune
将删除在
remotes/origin
中注册的分支(而不是“remote(s)”。它不会删除本地分支

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

  • 或者考虑了,例如,合并到
    主节点

    git fetch -p && git branch -d $(git branch master --merged | grep master -v)
    
  • 或者,如果你真的想:

最后一个选择是脆弱的:

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


OP正在尝试从本地删除过时分支的git remote prune origin,您的答案没有回答问题是的,分支的bugfix/encrdb_init已合并到master并在远程删除,但git没有删除它。@saketrp my answers States:git remote prune不会删除本地分支。bugfix/encrdb_init是一个本地分支。@ShubhamKhatri我的答案是正确的。它不是一个跟踪分支吗?从
git remote show origin
Try
git remote prune origin--dry run
的输出可以看出,检查过时的分支
git remote prune origin--dry run
输出是正确的empty@ShubhamKhatri它返回空,因为没有更多的远程跟踪分支可删除。而且
bugfix/encrdb_init
是一个本地分支(分支名称中可以有一个斜杠),使用上述命令,您应该会收到过期远程跟踪分支的
列表。如果你没有收到它,其他的东西可能是错误的
git fetch -p && git branch -d $(git branch master --merged | grep master -v)
git fetch -p && for branch in `git branch -vv | grep ': gone]' | awk '{print $1}'`; do git branch -D $branch; done
git branch --list --format "%(if:equals=[gone])%(upstream:track)%(then)%(refname)%(end)"