如何停止从指定的远程仓库获取给定分支?

12

我刚刚将一个新的远程分支添加到我的本地仓库中并进行了获取,现在我从新的远程仓库中获取了所有分支。有一个分支我不感兴趣,我想在执行git fetch <new remote>时停止获取它。

如何停止获取这个远程分支?

我已经使用了git branch -d -r <new remote>/<non-wanted branch>,但我需要做更多的事情来防止每次执行git fetch <new remote>时重新获取它。


请参考https://dev59.com/dmQn5IYBdhLWcg3wa2qV了解如何设置分支白名单。我不知道如何设置黑名单,就像你想要的那样。 - Chris Hayes
2个回答

6
正如opatut指出的那样,"不获取"远程分支参考的好处很少,如果你不关心它们,就不要使用它们。
如果你有一些自动化工具坚持要使用它们[编辑:如果你只想白名单,请见下文],有两个解决方法:
- 每次删除它们(需要在git fetch之后执行某些操作) - 使用下面描述的技巧(也需要在git fetch之后执行某些操作)
"远程分支"只是一个形式为refs/remotes/rmt/br的参考,其中rmt是远程名称(例如origin),br是分支名称(例如master)。创建它们的是您的存储库中的这行代码,您将在其中看到.git/config文件(运行git config -e在您的编辑器中打开它):
fetch = +refs/heads/*:refs/remotes/origin/*

这个命令告诉git fetch匹配所有符合refs/heads/*的ref名称并更新它们(由于含有+字符,所以强制更新-否则它们会被限制在快进更新范围内),但将它们的名称更改为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/

要枚举所有这些引用(使用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除外(这是一件非常奇怪的事情,但是嘿,我们刚刚做到了)。 (副注:它“硬链接”了一个符号远程引用,例如,如果有一个HEADref: ref/remotes/origin/master,则将其转换为它所指的任何内容。使用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将报错。


3
您不需要这样做。不获取它们没有任何益处。您将添加引用<remote>/<branch-name>,如果需要可以使用,但不必如此。所有对象都会被获取,因此性能/存储大小没有改善。
只需忽略该远程的分支即可。这不会影响您的本地分支。
如果您不知道:远程分支只是一个文件.git/refs/remotes/<remote-name>/<branch-name>中包含提交ID。 这个文件对您没有任何伤害 :)

3
不完全是这样。我有一个类似的情况,其中该分支具有巨大的大小(千兆字节),而我感兴趣的分支没有。由于空间紧张,我想避免获取所有那些我不感兴趣的大对象。那额外的空间确实会造成损害。 - Hans-Peter Störr
3
考虑到我的组织有数百或数千个分支,如果它们不是主要的后代或我正在处理的事物,让它们不会在我的日志、图表或自动完成中全部显示出来,这肯定是一种组织上的好处。 - Lucretiel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接