我刚刚将一个新的远程分支添加到我的本地仓库中并进行了获取,现在我从新的远程仓库中获取了所有分支。有一个分支我不感兴趣,我想在执行git fetch <new remote>
时停止获取它。
如何停止获取这个远程分支?
我已经使用了git branch -d -r <new remote>/<non-wanted branch>
,但我需要做更多的事情来防止每次执行git fetch <new remote>
时重新获取它。
我刚刚将一个新的远程分支添加到我的本地仓库中并进行了获取,现在我从新的远程仓库中获取了所有分支。有一个分支我不感兴趣,我想在执行git fetch <new remote>
时停止获取它。
如何停止获取这个远程分支?
我已经使用了git branch -d -r <new remote>/<non-wanted branch>
,但我需要做更多的事情来防止每次执行git fetch <new remote>
时重新获取它。
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
除外(这是一件非常奇怪的事情,但是嘿,我们刚刚做到了)。 (副注:它“硬链接”了一个符号远程引用,例如,如果有一个HEAD
是ref: 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
将报错。
<remote>/<branch-name>
,如果需要可以使用,但不必如此。所有对象都会被获取,因此性能/存储大小没有改善。.git/refs/remotes/<remote-name>/<branch-name>
中包含提交ID。 这个文件对您没有任何伤害 :)