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 --prune
和 then git pull
分支仍然是那里。
我不明白这种行为,清理陈旧分支的正确方法是什么?
首先,请注意 git fetch
中的 --all
表示 所有遥控器 ,而不是 所有引用 。也就是说,如果您有一个名为 origin
的常用单个遥控器,--all
什么都不做。
接下来,请记住 分支名称 (refs/heads/
中的名称,例如 refs/heads/master
)和 remote-tracking name,有时称为 remote-tracking branch name,它是 refs/remotes/
下的引用,后跟远程名称。 --prune
所做的是删除在特定遥控器上没有相应名称的远程跟踪名称。
git fetch
通常做的是:
在 URL 中调用与该遥控器一起存储的 Git,例如,从 origin
中获取时来自 git config --get remote.origin.url
的 Git。
让他们列出他们的参考名称(运行 git ls-remote
以查看这些)。
与那个 Git 对话以获得 Git 个对象——主要是提交对象,但是第 2 步中输出的任何对象都是候选对象——他们有,我们没有't,我们想要的(基于给 git fetch
的任何附加参数或配置的设置)。
最后,在获取所有对象后,创建或更新本地名称,通常形式为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
设置似乎很可能是非标准的,这可能是因为将克隆创建为单分支克隆。
如果我 运行 git fetch --all --prune
是在本地删除陈旧的分支还是首先从克隆中获取所有分支然后进行清理。
我注意到一个案例,我从一台机器上做了 git push --delete origin some_branch
然后在另一个完整的实例中做了 git fetch --all --prune
和 then git pull
分支仍然是那里。
我不明白这种行为,清理陈旧分支的正确方法是什么?
首先,请注意 git fetch
中的 --all
表示 所有遥控器 ,而不是 所有引用 。也就是说,如果您有一个名为 origin
的常用单个遥控器,--all
什么都不做。
接下来,请记住 分支名称 (refs/heads/
中的名称,例如 refs/heads/master
)和 remote-tracking name,有时称为 remote-tracking branch name,它是 refs/remotes/
下的引用,后跟远程名称。 --prune
所做的是删除在特定遥控器上没有相应名称的远程跟踪名称。
git fetch
通常做的是:
在 URL 中调用与该遥控器一起存储的 Git,例如,从
origin
中获取时来自git config --get remote.origin.url
的 Git。让他们列出他们的参考名称(运行
git ls-remote
以查看这些)。与那个 Git 对话以获得 Git 个对象——主要是提交对象,但是第 2 步中输出的任何对象都是候选对象——他们有,我们没有't,我们想要的(基于给
git fetch
的任何附加参数或配置的设置)。最后,在获取所有对象后,创建或更新本地名称,通常形式为
refs/remotes/<em>remote</em>/ <em>name</em>
,基于在该遥控器上看到的分支名称。但是请看下面,因为这一步有复杂性。在此更新期间,如果您启用了 p运行ing(通过
--prune
或配置选项)。这一切都在git pull
之前,其中 运行sgit 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
设置似乎很可能是非标准的,这可能是因为将克隆创建为单分支克隆。