2016-04-22 57 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