请考虑以下存储库。它有很多供团队成员使用的私有分支,都在 refs/heads/team/
命名空间下,我不想获取,但我仍然想获取所有其他分支,包括该 team
命名空间之外的任何可能新创建的分支。
$ git ls-remote http://gerrit.asterisk.org/asterisk refs/heads/* | wc -l
217
$ git ls-remote http://gerrit.asterisk.org/asterisk refs/heads/* | grep -v refs/heads/team/ | wc -l
32
我正在获取fetch = +refs/heads/*:refs/remotes/golden/*
,但这些私有分支只是压倒了我的refs/remote/golden
命名空间,使其更难概述,并且还需要更多空间用于本地存储库。
是否可以获取refs/heads/*
,但排除refs/heads/team/*
?
不幸的是,没有。
幸运的是,你可以任意接近,特别是如果你愿意每次都使用两次获取,或者一个获取后再使用删除通道(可能这实际上会更有效,或者至少是时间效率;它可能需要更多的空间,这取决于有多少对象最终变得无用)。
从本质上讲,这里的想法是列出要采取的所有内容,首先运行git ls-remote
然后进行自己的过滤并重写远程的fetch =
条目(好吧,条目):
git ls-remote "$remote" 'refs/heads/*' |
(git config --unset-all "remote.$remote.fetch";
while read hash ref; do
case $ref in refs/heads/team/*) continue;; esac
rmtref="refs/remotes/$remote/${ref#refs/heads/}"
git config --add "remote.$remote.fetch" "+$ref:$rmtref"
done)
git fetch "$remote"
(添加一些前端工作以适当地设置$remote
)。 使这项工作的关键是 git 组合然后遵守所有fetch =
行。
对于另一个想法,运行一个正常的(+refs/heads/*:refs/remotes/...
)获取,然后对与不需要的形式匹配的引用进行一系列git update-ref -d refs/remotes/$remote/${ref#refs/heads/}
。 如果您愿意,可以在之后抛入git gc
(或git repack
和/或修剪)以缩小存储库。
复制:跳过将一些分支/标签复制到本地 Git git fetch --all
自 Git 2.29 起支持此功能:
假设您的远程数据库名为 origin,您应该能够使用 git config --add remote.origin.fetch '^refs/heads/team/*'
从提取中排除refs/heads/team/
前缀。