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

残念ながら、

幸運なことに、特に2パスのフェッチを毎回、またはフェッチとそれに続く削除パスを使用したい場合は、任意に閉じることができます(おそらく、これは実際より効率的です。どれくらい多くのオブジェクトが無駄になるかに応じて、いくらかスペースが必要になります)。

基本的にここでの考え方は、最初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および/またはprune)を投げてリポジトリを縮小します。

+0

ありがとうございました!私は実際に夜間のcronジョブで最初の(スクリプト)ソリューションを使用します。 – kkm

関連する問題