git remote prune origin 不删除本地分支,即使它的上游远程分支被删除
git remote prune origin does not delete the local branch even if its upstream remote branch is deleted
这对我来说是一个常见的用例,我克隆一个存储库,签出一个分支,做一些代码更改,进行多次提交,然后当它稳定时,我推送到远程,最终分支被合并并删除,我只剩下一个本地分支,上游消失了。
我正在寻找删除所有此类分支的安全方法。从描述来看,似乎 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
命令仅删除remotes/origin
命名空间中的远程跟踪分支。
不是本地分支机构。
通常的做法是delete only merged local branches.
git 分支(即使使用 -vv)只显示 local 分支。
一个branch can have a slash in its name
远程跟踪分支在 remotes/origin
命名空间中,并记录获取的内容。
upstream branch 是与本地分支相关联的远程分支,以便所述本地分支知道 要推送的位置。
git 远程修剪正确删除了远程跟踪分支,它恰好是本地 bugfix/encrdb_init
分支的上游分支。
这就是为什么您会看到 origin/bugfix/encrdb_init: gone
:远程跟踪分支已消失。
OP 添加:
from the description, it seemed like git remote prune origin
is doing this exactly. But it doesn't seem to be working for me.
不,描述中没有提到本地分支机构。
Deletes all stale remote-tracking branches under <name>
.
These stale branches have already been removed from the remote repository referenced by <name>
, but are still locally available in "remotes/<name>
".
<name>
这里是 remote repo 的名字,被 git remote -v.
引用
通常是“origin
”.
git remote prune
将删除在 remotes/origin
中注册的分支(而不是 "remote(s)")。它不会删除本地分支。
要"safely"删除本地分支,您应该:
要么考虑到ones that are merged locally,比如合并到master
:
git fetch -p && git branch -d $(git branch master --merged | grep master -v)
或者,如果你真的想要 delete immediately the one whose upstream branch is "gone":
git fetch -p && for branch in `git branch -vv | grep ': gone]' | awk '{print }'`; do git branch -D $branch; done
最后一个选项是不稳定的:
- 我更喜欢使用 git branch -d 而不是 -D,以便只删除已经合并的分支。
- 您最终可能会删除带有包含字符串“
: gone
” 的提交消息的分支
一个better way to list those branches is:
git branch --list --format "%(if:equals=[gone])%(upstream:track)%(then)%(refname)%(end)"
这对我来说是一个常见的用例,我克隆一个存储库,签出一个分支,做一些代码更改,进行多次提交,然后当它稳定时,我推送到远程,最终分支被合并并删除,我只剩下一个本地分支,上游消失了。
我正在寻找删除所有此类分支的安全方法。从描述来看,似乎 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
命令仅删除remotes/origin
命名空间中的远程跟踪分支。
不是本地分支机构。
通常的做法是delete only merged local branches.
git 分支(即使使用 -vv)只显示 local 分支。
一个branch can have a slash in its name
远程跟踪分支在 remotes/origin
命名空间中,并记录获取的内容。
upstream branch 是与本地分支相关联的远程分支,以便所述本地分支知道 要推送的位置。
git 远程修剪正确删除了远程跟踪分支,它恰好是本地 bugfix/encrdb_init
分支的上游分支。
这就是为什么您会看到 origin/bugfix/encrdb_init: gone
:远程跟踪分支已消失。
OP 添加:
from the description, it seemed like
git remote prune origin
is doing this exactly. But it doesn't seem to be working for me.
不,描述中没有提到本地分支机构。
Deletes all stale remote-tracking branches under
<name>
.
These stale branches have already been removed from the remote repository referenced by<name>
, but are still locally available in "remotes/<name>
".
<name>
这里是 remote repo 的名字,被 git remote -v.
引用
通常是“origin
”.
git remote prune
将删除在 remotes/origin
中注册的分支(而不是 "remote(s)")。它不会删除本地分支。
要"safely"删除本地分支,您应该:
要么考虑到ones that are merged locally,比如合并到
master
:git fetch -p && git branch -d $(git branch master --merged | grep master -v)
或者,如果你真的想要 delete immediately the one whose upstream branch is "gone":
git fetch -p && for branch in `git branch -vv | grep ': gone]' | awk '{print }'`; do git branch -D $branch; done
最后一个选项是不稳定的:
- 我更喜欢使用 git branch -d 而不是 -D,以便只删除已经合并的分支。
- 您最终可能会删除带有包含字符串“
: gone
” 的提交消息的分支
一个better way to list those branches is:
git branch --list --format "%(if:equals=[gone])%(upstream:track)%(then)%(refname)%(end)"