11

I've just added a new remote to my local repository and fetched, now I got all the branches from the new remote fetched. There's one branch I have no interest, and I want to stop fetching it when I do git fetch <new remote>.

How do I stop fetching such remote branch?

I've done git branch -d -r <new remote>/<non-wanted branch> but I need to do something more to stop refetching it at each git fetch <new remote>.

4

2 回答 2

6

正如opatut 指出的那样,“不获取”远程分支引用几乎没有任何好处:只是不要使用您不关心的那些。

如果你有一些自动化的东西坚持使用它们[编辑:并且想要将某些分支列入黑名单——如果你只是想列入名单,见下文],有两种解决方法:

  • 每次都删除它们(需要在之后做一些事情git fetch
  • 使用下面描述的技巧(也需要在之后做一些事情git fetch

“远程分支”只是形式的引用,其中是远程的名称(例如,),是分支的名称(例如,)。创建它们的是您将在您的 repo文件中看到的这一行(运行以在您的编辑器中显示它):refs/remotes/rmt/brrmtoriginbrmaster.git/configgit 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(这是一件非常奇怪的事情,但是嘿,我们刚刚完成了)。(旁注:它“硬链接”,可以说是一个象征性的远程引用,例如,如果有一个HEADthat is a ref: ref/remotes/origin/masterthis 则将其转换为所引用的任何内容。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如果遥控器不再具有这些分支之一,则会出错。]

于 2013-09-18T04:33:59.293 回答
3

你不。获取它们没有任何好处。您可以添加参考<remote>/<branch-name>,如果需要,您可以使用它,但不是必须的。并且无论如何都会获取所有对象,因此没有性能/存储大小改进。

只需忽略那个遥控器的分支。您当地的分支机构不受此影响。

如果您不知道:远程分支只不过是一个.git/refs/remotes/<remote-name>/<branch-name>包含提交 ID 的文件。这个文件应该不会伤害你:)

于 2013-09-18T03:26:35.397 回答