如果我运行git fetch --all --prune
,这会在本地删除过时的分支,还是首先从克隆中获取所有分支,然后进行清理。
我注意到一个案例,我从一台机器上做git push --delete origin some_branch
,然后在做git fetch --all --prune
和然后 git pull
后进入另一个完整的实例时,分支仍在那里。<登记/>
我不明白这种行为,清理陈旧树枝的正确方法是什么?
答案 0 :(得分:2)
首先,请注意--all
中的git fetch
表示所有远程,而不是所有引用。也就是说,如果你有通常的名为origin
的单个遥控器,--all
什么都不做。
接下来,请记住分支名称 - refs/heads/
中的名称(例如refs/heads/master
)与远程跟踪名称< em>,有时称为远程跟踪分支名称,它是refs/remotes/
下的引用,后跟远程名称。 --prune
的作用是删除特定遥控器上没有相应名称的远程跟踪名称。
git fetch
通常做的是:
git config --get remote.origin.url
获取origin
时的git ls-remote
。git fetch
以查看这些名称)。refs/remotes/remote/name
或配置的设置。最后,在获取所有对象后,根据该遥控器上显示的分支名称创建或更新本地名称,通常为--prune
形式。但请参阅下文,因为这一步有并发症。
在此次更新期间,如果您已启用修剪(通过git pull
或配置选项),您的Git可能删除部分远程跟踪名称。在git fetch
运行--prune
后跟第二个Git命令运行第二个Git命令之前,这一切都很好。
最后请注意,要使remote.remote.fetch
正常工作,您需要一个典型的remote.origin.fetch
设置,例如,+refs/heads*:refs/remotes/origin/*
会读取git fetch --prune
,然后refs/remotes/origin/xyzzy
如果refs/heads/xyzzy
的Git存储库中没有remote.origin.url
,则会从您自己的存储库中删除--single-branch
。如果您制作了remote.origin.fetch
克隆,则--prune
行会有不同的内容,而remote.origin.fetch
将无效。
根据您观察到的情况,您可能有非标准{{1}}设置,可能是因为将克隆创建为单分支克隆。