2016-04-22 37 views
1

请考虑以下存储库。它有许多私人分支供团队成员使用,全部在refs/heads/team/命名空间下,我不想获取,但我仍然想要获取所有剩余的分支,包括team命名空间以外的任何可能新创建的分支。忽略git中的单个命名空间refspec

$ 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/*

回答

1

不幸的是,没有。

幸运的是,你可以任意关闭,特别是如果你愿意每次使用两遍读取,或者是一次读取后执行删除遍历(可能这实际上会更有效率,或者至少是时间效率;这可能需要更多的空间,取决于有多少物体变得无用)。

基本上这里的想法是要列出一切拿地,先运行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运行正常(+refs/heads/*:refs/remotes/...)抓取,后跟一系列git update-ref -d refs/remotes/$remote/${ref#refs/heads/}。如果愿意,可以在git gc(或git repack和/或prune)之后折腾,以缩小存储库。

+0

谢谢!我将在夜间的cron工作中实际使用您的第一个(脚本)解决方案。 – kkm