2012-09-18 9 views
17

ソースコードとバイナリの両方を含むgit repoがあります。裸のレポは現在〜9GBに達しており、複製には年月がかかります。ほとんどの場合、「リモート:オブジェクトの圧縮」に費やされます。より大きなバイナリの新しいバージョンでコミットした後、フェッチに時間がかかり、オブジェクトをサーバ上で圧縮するのにも時間がかかります。大きなバイナリファイルのために遅くなっているgit repoの修正

git pull without remotely compressing objectsを読んだ後、私はバイナリファイルのデルタ圧縮が私たちにも悪影響を及ぼしていると思っていますが、これを修正する方法は100%わかりません。

サーバ上でベアレポを修正する正確な手順は何ですか?私の推測:

  • は.gitに/情報/
  • ファイル名を指定して実行「Gitの再梱包」を属性が、どのようなオプションを使用して、私がしたいすべての拡張のために「* .zipファイル - デルタ」のようなエントリを追加しますか? -adFはすべてを再パックし、指定されたファイルタイプに対してデルタ圧縮が行われていないレポを残しますか?
  • 'git prune'を実行します。私はこれが自動的に行われたと思ったが、レポの裸のクローンで遊んだときにそれを実行すると、サイズが〜2GB減少した。
  • リポジトリをクローンし、.gitで追加したのと同じエントリ/裸のレポの/ info/attributes

私は何かにはありますか?

アップデート:この上

いくつかの興味深いテスト結果。今日私は問題のあるレポの裸のクローンを始めました。それほど強力ではないサーバーには4GBのRAMがあり、メモリが不足していて交換が始まった。 3時間後に私はあきらめました...

私は代わりに私の最新の作業コピーから裸のレポをクローンしました。ワークステーション間のクローニングには5分かかりました。私はそれを新しいレポとしてサーバーにプッシュしました。クローニングレポにわずか7分かかりました。

これを正しく解釈すると、バイナリファイルのデルタ圧縮を無効にしなくても、より優れた圧縮レポがさらに優れたパフォーマンスを発揮します。私はこれが上記のステップが実際に私が短期的にやりたいことであることを意味すると思いますが、さらに、サーバー上の圧縮/圧縮に使用できるメモリの量を制限する方法を見つける必要があります。交換。

重要な場合:サーバーはgit 1.7.0.4を実行し、ワークステーションは1.7.9.5を実行します。

アップデート2:

梱包とき、私は私のtestrepoで次の手順をした、と私は(バックアップ後)、サーバー上

  • 制限メモリ使用量を、それらを行う機会になると思いますオブジェクト

    gitの設定pack.windowMemory 100メートル
    Gitの設定パック。

    エコー '* .tar.gzを - デルタ' >>情報/属性
    エコー '* .tar.bz2と - デルタ' >>いくつかの拡張のためのpackSizeLimit 200メートル

  • 無効にデルタ圧縮情報/属性
    エコー '* .binファイル - デルタ' >>情報/属性
    エコー '* .PNG - デルタ' >>情報/

  • 0属性
  • 詰め直すリポジトリ及びごみを収集

    gitの再パック-a -d -F --windowメモリ100メートル--maxパックサイズ200メートル
    GitのGC

アップデート3:

この操作後の予期しない副作用:Issues after trying to repack a git repo for improved performance

+3

他の場所にバイナリを格納するオプションがありますか? Gitは大きなバイナリで本当にうんざりしていますが、それは認められています。そのため、[別の](http://caca.zoy.org/wiki/git-bigfiles)[製品](http://git-annex.branchable.com/)があります。 – eis

+0

gitで始まったのは、gitリビジョンをチェックするだけで、過去の完全なスナップショットを取得できるように、uCバイナリ、つまりrootfsとtoolchainが追加されました。私たちは、不調を予知するのに十分なことを知らなかった。私はこれを正しく修正しようとしています(git-annexを見ていましたが、git-bigfilesについてはわかりませんでしたが)短期的な解決策として、現在のレポのパフォーマンスをできる限り向上させたいと思います。 – anr78

+0

あなたのdev環境/ツールチェインを仮想マシンに保存する方が良いと思います(あなたのdev環境の異なるバージョンを保存する必要がある場合は、新しいディスクイメージをレポの外に保存するだけです)。 –

答えて

1

大きなバイナリを格納するのに異なるメカニズムを使用する必要があります。格納することができないものから生成されたものであれば、それを生成するコードだけです。そうでなければ、それらをすべて単一のディレクトリに移動し、あなたの必要に応じてrsyncまたはsvn。

+0

健全な助言ですが、私たちの場合は適用されません。最大の(そして最も問題の多い)バイナリは、ビルドに数時間かかるtar.bz2のルートファイルです。 – anr78

+3

そのrootfs上のファイルのほとんどが実際には各ビルドで変更されていると思いますので、圧縮するのではなく、それらを直接リポジトリに追加するほうが賢いかもしれません。結果として得られるtar.bz2ファイルの代わりにtarに追加するディレクトリー全体)、diffを小さくする必要があります。これはgitがdiff-ingバイナリーをうまく処理しないためです。 – xception

7

現在のレポをより効率的にする方法について質問されていますが、それは実現可能だとは思いません。

  1. は、仮想マシンイメージにあなたのdevの環境を移動し、あなたのレポのうち、あなたの大きなバイナリを動かし
  2. https://www.virtualbox.org/
  3. 使用あなたのレポをきれいにするために、このPythonスクリプト

    は、群衆のアドバイスに従ってください(私はレポにそれを使用し、それは偉大な働きました)https://gist.github.com/1433794
+0

私は、より恒久的な修正のためにその戦略に絶対に同意します。開発環境にVMを使用するのではなく、サーバーにバージョンを格納することを検討し、現在のバージョンのrepoポイントにファイルを置くことを検討します。しかし、現在のレポをより効率的にすることはできませんか?私がリンクしている投稿を理解していれば、それをもっと良くすることが可能になるはずです。もし私が "リモート:圧縮オブジェクト"を取り除くことができれば(それは初期のクローンではなく)将来のフェッチのためだけに、それ自体が役に立ちます。 – anr78

関連する問題