我已将fetch refspec更改为隐藏远程分支,目前我只有master
:
$ git config remote.origin.fetch
+refs/heads/master:refs/remotes/origin/master
但是所有其他分支仍然在这里,git branch -r
显示它们。如何修剪它们? git remote prune origin
和git fetch --prune origin
什么都不做。
git v1.8.4
答案 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
目录的内容。存储分支的位置有两个:
.git/refs/remotes/origin
中的显式参考文件:因此您可以删除不再需要的远程分支的文件。.git/packed-refs
中作为打包引用:您需要删除如下所示的行:<commit-hash> refs/remotes/origin/<branch>
。或者,您也可以使用git remote remove origin
完全删除遥控器。当然,这也将删除您当地分支机构的跟踪信息。 但是,您可以通过制作.git/config
文件的副本来轻松备份该信息。跟踪信息仅以这样的格式存储在那里:
[branch "master"]
remote = origin
merge = refs/heads/master
因此,如果您备份该文件,然后删除远程,然后恢复.git/config
,则应该再次返回远程(包括您的自定义refspec),后续git fetch
应仅提取自定义refspec中包含的那些分支。以前存在的映射到本地分支也会恢复。