正如opatut 指出的那样,“不获取”远程分支引用几乎没有任何好处:只是不要使用您不关心的那些。
如果你有一些自动化的东西坚持使用它们[编辑:并且想要将某些分支列入黑名单——如果你只是想列入白名单,见下文],有两种解决方法:
- 每次都删除它们(需要在之后做一些事情
git fetch
)
- 使用下面描述的技巧(也需要在之后做一些事情
git fetch
)
“远程分支”只是形式的引用,其中是远程的名称(例如,),是分支的名称(例如,)。创建它们的是您将在您的 repo文件中看到的这一行(运行以在您的编辑器中显示它):refs/remotes/rmt/br
rmt
origin
br
master
.git/config
git config -e
fetch = +refs/heads/*:refs/remotes/origin/*
这告诉git fetch
它应该获取所有匹配的引用名称refs/heads/*
并更新它们(强制,因为+
字符 - 否则它们将被限制为快进更新)但将它们的名称更改为refs/remotes/origin/*
,这*
部分显然匹配。
因此,如果您将其更改为:
fetch = +refs/heads/*:refs/real-remotes/origin/*
该git fetch
操作将更新(或根据需要创建)refs/real-remotes/origin
而不是refs/remotes/origin
.
然后你可以这样做:
git for-each-ref refs/real-remotes/origin/
枚举所有这些 refs(以及所有可用的选项git for-each-ref
),并通过脚本运行它们,删除任何黑名单并更新refs/remotes/origin/
. 例如:
git for-each-ref refs/real-remotes/origin/ |
while read sha1 reftype refname; do
shortname=${refname#refs/real-remotes/origin/}
if [ $shortname != master ]; then
git update-ref refs/remotes/origin/$shortname $sha1
fi
done
这会更新所有内容,除了 master
(这是一件非常奇怪的事情,但是嘿,我们刚刚完成了)。(旁注:它“硬链接”,可以说是一个象征性的远程引用,例如,如果有一个HEAD
that is a ref: ref/remotes/origin/master
this 则将其转换为所引用的任何内容。git symbolic-ref
用于测试此类引用,尽管它已启动让你弄清楚如何处理它们,一旦你找到任何东西。)
(这与显式删除某些特定远程分支之间的主要区别在于,此版本将远程分支留在周围,而不对其进行更新。例如,这保持origin/master
不动;“真正的”远程主控现在仅在refs/real-remotes/origin/master
.)
[编辑:如果您只想将特定分支列入白名单,只需明确列出它们:
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/devel:refs/remotes/origin/devel
根据需要使用尽可能多的fetch =
行。请注意,git fetch
如果遥控器不再具有这些分支之一,则会出错。]