获取refspec更改后修剪远程分支

时间:2016-03-11 10:31:59

标签: git

我已将fetch refspec更改为隐藏远程分支,目前我只有master

$ git config remote.origin.fetch
+refs/heads/master:refs/remotes/origin/master

但是所有其他分支仍然在这里,git branch -r显示它们。如何修剪它们? git remote prune origingit fetch --prune origin什么都不做。

git v1.8.4

1 个答案:

答案 0 :(得分:1)

似乎Git不会修剪与配置的fetch refspec不匹配的远程分支,而只修剪那些真正不再存在的远程分支。所以一旦你改变了refspec,Git就完全忽略了现有的远程分支。

我担心你必须手动删除远程分支:

git branch -d -r origin/other-branch

documentation for fetch --prune实际上解释了这种关于标签的行为(强调我的):

  

获取后,删除遥控器上不再存在的所有远程跟踪引用。如果仅由于默认标记自动跟踪或由于--tags选项而提取标记,则不对其进行修剪。 但是,如果由于显式refspec (在命令行或远程配置中提取标记,例如,如果使用--mirror选项克隆远程),那么它们将被提取也需要修剪

所以如果标签包含在refspec中,那么它们只会被修剪掉;这意味着fetch --prune可能只修剪它将使用refspec访问的引用。因此,如果从refspec中排除分支,则不再对这些分支进行修剪。

如果你想摆脱很多的远程分支,你可以随时采用hacky方式修改.git目录的内容。存储分支的位置有两个:

  1. 作为.git/refs/remotes/origin中的显式参考文件:因此您可以删除不再需要的远程分支的文件。
  2. .git/packed-refs中作为打包引用:您需要删除如下所示的行:<commit-hash> refs/remotes/origin/<branch>
  3. 或者,您也可以使用git remote remove origin完全删除遥控器。当然,这也将删除您当地分支机构的跟踪信息。 但是,您可以通过制作.git/config文件的副本来轻松备份该信息。跟踪信息仅以这样的格式存储在那里:

    [branch "master"]
        remote = origin
        merge = refs/heads/master
    

    因此,如果您备份该文件,然后删除远程,然后恢复.git/config,则应该再次返回远程(包括您的自定义refspec),后续git fetch应仅提取自定义refspec中包含的那些分支。以前存在的映射到本地分支也会恢复。