如果我运行git fetch --all --prune
,它会在本地删除陈旧的分支,还是先从克隆中获取所有分支,然后再进行清理。
我注意到一个例子,我在一台机器上执行git push --delete origin some_branch
,然后在另一个完整的实例中,在执行完git fetch --all --prune
和git pull
之后,分支仍然在那里。
我不理解这种行为,怎样才是清理陈旧树枝的正确方法呢?
发布于 2018-06-10 05:20:07
首先,要知道git fetch
中的--all
表示所有的远程对象,而不是所有的引用。也就是说,如果您有一个名为origin
的普通遥控器,那么--all
什么也不做。
接下来,请记住分支名称之间的区别- refs/heads/
中的名称,如refs/heads/master
-and远程跟踪名称,有时称为远程跟踪分支名称,它是refs/remotes/
下的引用,后跟远程跟踪的名称。--prune
所做的是删除在特定遥控器上没有对应名称的远程跟踪名称。
git fetch
通常做的是:
当从origin
.获取时,
git ls-remote
查看这些名称)。git fetch
的任何其他参数或配置的设置)。最后,在获得所有对象之后,创建或更新本地名称,通常是基于在该远程服务器上看到的分支名称的refs/remotes/remote/name
,形式的
在此更新期间,如果您启用了剪枝功能(通过--prune
或配置选项),您的Git可能会删除一些远程跟踪名称。这一切都发生在运行git fetch
和第二个Git命令的git pull
可以运行它的第二个Git命令之前。
最后,请注意,为了让--prune
正常工作,您需要一个典型的remote.remote.fetch
设置,例如,remote.origin.fetch
将读取+refs/heads*:refs/remotes/origin/*
,然后git fetch --prune
将从您自己的存储库中删除一个refs/remotes/origin/xyzzy
,如果在remote.origin.url
的Git存储库中没有refs/heads/xyzzy
。如果您创建了--single-branch
克隆,则remote.origin.fetch
行将具有不同的内容,并且--prune
将无效。
根据您所观察到的,您可能有一个非标准的remote.origin.fetch
设置,这可能是因为您已经将克隆创建为单分支克隆。
https://stackoverflow.com/questions/50778523
复制相似问题