Git 中清理陈旧分支的正确方法是什么?

What is the proper way in Git for clean up of stale branches?

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

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

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

git fetch通常做的是:

  1. 在 URL 中调用与该遥控器一起存储的 Git,例如,从 origin 中获取时来自 git config --get remote.origin.url 的 Git。

  2. 让他们列出他们的参考名称(运行 git ls-remote 以查看这些)。

  3. 与那个 Git 对话以获得 Git 个对象——主要是提交对象,但是第 2 步中输出的任何对象都是候选对象——他们有,我们没有't,我们想要的(基于给 git fetch 的任何附加参数或配置的设置)。

  4. 最后,在获取所有对象后,创建或更新本地名称,通常形式为refs/remotes/<em>remote</em>/ <em>name</em>,基于在该遥控器上看到的分支名称。但是请看下面,因为这一步有复杂性。

    在此更新期间,如果您启用了 p运行ing(通过--prune 或配置选项)。这一切都在 git pull 之前,其中 运行s git fetch 后跟第二个 Git 命令,可以 运行 它的第二个 Git 命令。

最后,请注意,要使 --prune 正常工作,您需要一个典型的 remote.<em>remote</em>.fetch 设置,例如,remote.origin.fetch 将读取 +refs/heads*:refs/remotes/origin/*,然后 git fetch --prune 将从您自己的存储库中删除 refs/remotes/origin/xyzzy 如果 [=90] 中没有 refs/heads/xyzzy =] 存储库位于 remote.origin.url。如果你做了一个--single-branch克隆,remote.origin.fetch行会有不同的内容,--prune将无效。

根据您的观察,您的 remote.origin.fetch 设置似乎很可能是非标准的,这可能是因为将克隆创建为单分支克隆。