git remote prune –没有显示我预期的那么多修剪的分支


113

从手册页:

Deletes all stale tracking branches under <name>.
These stale branches have already been removed from the remote repository
referenced by <name>, but are still locally available in "remotes/<name>".

所以我删除了使用

git push origin :staleStuff

然后跑

git remote prune origin

但是,只修剪了一个本地分支。这些分支中的一些是由我创建的,有些是由同事创建的。这是否表明我一开始没有正确地跟踪那些分支?


7
找出将要删除的分支,您可以做git remote show origin并查找标记为任何分支stale
某处某人2013年

Answers:


189

使用时git push origin :staleStuff,它会自动删除origin/staleStuff,因此当您运行时git remote prune origin,您已经修剪了被其他人删除的某个分支。您的同事现在更有可能需要奔跑git prune才能摆脱已删除的分支。


那到底git remote prune是什么呢?主要思想:本地分支(非跟踪分支)不会被git remote prune命令触及,应手动删除。

现在,为更好地理解而提供的真实示例:

您有一个带有2个分支的远程存储库:masterfeature。假设您同时在两个分支上工作,因此,您在本地存储库中拥有了这些引用(给出了完整的引用名称以避免任何混淆):

  • refs/heads/master(简称master
  • refs/heads/feature(简称feature
  • refs/remotes/origin/master(简称origin/master
  • refs/remotes/origin/feature(简称origin/feature

现在,一个典型的场景:

  1. 其他一些开发人员完成了上的所有工作feature,将其合并到远程存储库中masterfeature从远程存储库中删除分支。
  2. 默认情况下,当您这样做git fetch(或git pull)时,不会从本地存储库中删除任何引用,因此您仍然拥有所有这4个引用。
  3. 您决定清理它们并运行git remote prune origin
  4. git检测到该feature分支不再存在,因此应删除refs/remotes/origin/feature一个过时的分支。
  5. 现在您有3个参考,包括refs/heads/feature,因为git remote prune不会删除任何refs/heads/*参考。

通过branch.<branch_name>.merge配置参数可以识别与远程跟踪分支关联的本地分支。确实不需要使用此参数(可能除外git pull),因此它可能会丢失。

(已更新示例和评论中的有用信息)


我知道情况是:分支仍然在本地存在,但已从远程仓库中删除。现在,我想删除远程上不存在的所有本地分支,因此我运行git prune。这就是“这些陈旧的分支已从远程存储库中删除”的意思。我错了吗?
Felixyz

3
您是正确的,但在的情况下,您可能会误解了“本地分支机构”的含义git prune。只有其中的分支/refs/remotes/<remote_name>/可以进行修剪;任何分支/refs/heads/都不会受到影响-您必须手动管理这些分支。
最大

啊哈,那确实是我的想法。因此,没有办法做我想要的事情:通过检查是否删除了远程分支,自动删除了正在跟踪远程分支的头部中的所有分支?
Felixyz

2
没有内置命令,但是您可以自己编写这样的脚本。可以通过branch.<branch_name>.mergeconfig参数的存在来识别跟踪分支。
最大

如果您将注释中的信息添加到答案本身中,这样最好的答案是,这样每个来这里并与@Felixyz有相同误解的人都不必滑稽地看您的答案,然后阅读注释即可最终获得理解。 。
Akrikos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.