Git清理过时树枝的正确方法是什么?

时间:2018-06-09 21:03:39

标签: git git-branch git-pull git-fetch

如果我运行git fetch --all --prune,这会在本地删除过时的分支,还是首先从克隆中获取所有分支,然后进行清理。
我注意到一个案例,我从一台机器上做git push --delete origin some_branch,然后在做git fetch --all --prune然后 git pull后进入另一个完整的实例时,分支仍在那里。<登记/> 我不明白这种行为,清理陈旧树枝的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

首先,请注意--all中的git fetch表示所有远程,而不是所有引用。也就是说,如果你有通常的名为origin的单个遥控器,--all什么都不做。

接下来,请记住分支名称 - refs/heads/中的名称(例如refs/heads/master)与远程跟踪名称,有时称为远程跟踪分支名称,它是refs/remotes/下的引用,后跟远程名称。 --prune的作用是删除特定遥控器上没有相应名称的远程跟踪名称。

git fetch通常做的是:

  1. 使用该遥控器存储的网址调用Git,例如,从git config --get remote.origin.url获取origin时的git ls-remote
  2. 让他们列出他们的参考名称(运行git fetch以查看这些名称)。
  3. 与Git交谈以获取Git对象 - 主要是提交对象,但是步骤2中输出的任何对象都是候选者 - 他们拥有,我们不想要的,我们想要的(基于给出的任何其他参数)到refs/remotes/remote/name或配置的设置。
  4. 最后,在获取所有对象后,根据该遥控器上显示的分支名称创建或更新本地名称,通常为--prune形式。但请参阅下文,因为这一步有并发症。

    在此次更新期间,如果您已启用修剪(通过git pull或配置选项),您的Git可能删除部分远程跟踪名称。在git fetch运行--prune后跟第二个Git命令运行第二个Git命令之前,这一切都很好。

  5. 最后请注意,要使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}}设置,可能是因为将克隆创建为单分支克隆。