20

ソースコードとバイナリの両方を含むgitリポジトリがあります。ベアリポジトリは現在約9GBに達しており、クローン作成には何年もかかります。ほとんどの時間は「リモート:オブジェクトの圧縮」に費やされます。大きなバイナリの1つの新しいバージョンでコミットした後、フェッチには長い時間がかかり、サーバー上のオブジェクトの圧縮にも費やされます。

オブジェクトをリモートで圧縮せずにgitpullを読んだ後、バイナリファイルのデルタ圧縮も私たちを傷つけているのではないかと思いますが、これを修正する方法が100%わかりません。

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

  • 必要なすべての拡張子の「*.zip-delta」のようなエントリを.git/info/attributesに追加します
  • 'git repack'を実行しますが、どのようなオプションがありますか?-adFはすべてを再パックし、指定されたファイルタイプでデルタ圧縮が行われたことがないリポジトリを残しますか?
  • 'gitprune'を実行します。これは自動的に行われると思いましたが、上記のリポジトリの裸のクローンで遊んだときに実行すると、サイズが最大2GB減少しました
  • リポジトリのクローンを作成し、ベアリポジトリの.git / info/attributesに追加したのと同じエントリで.gitattributesを追加してコミットします

私は何かに取り組んでいますか?

アップデート:

これに関するいくつかの興味深いテスト結果。今日、私は問題のあるリポジトリのベアクローンを開始しました。4GBのRAMを搭載したそれほど強力ではないサーバーがメモリを使い果たし、スワッピングを開始しました。3時間後に私はあきらめました...

次に、代わりに、最新の作業コピーからベアリポジトリのクローンを作成しました。ワークステーション間でのクローン作成には約5分かかりました。次に、それを新しいリポジトリとしてサーバーにプッシュしました。そのレポのクローン作成には7分しかかかりませんでした。

これを正しく解釈すると、バイナリファイルのデルタ圧縮を無効にしなくても、パックされたリポジトリのパフォーマンスが大幅に向上します。これは、上記の手順が実際に短期的にやりたいことであることを意味していると思いますが、それに加えて、サーバーでのパッキング/圧縮に使用できるメモリの量を制限する方法を見つける必要があります。スワッピング。

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

アップデート2:

私は自分のtestrepoで次の手順を実行しましたが、サーバーで実行する可能性があると思います(バックアップ後)

  • オブジェクトをパックするときのメモリ使用量を制限する

    git config pack.windowMemory 100m
    git config pack.packSizeLimit 200m

  • 一部の拡張機能のデルタ圧縮を無効にする

    echo'* .tar.gz -delta' >> info / attributes
    echo'* .tar.bz2 -delta' >> info / attributes
    echo'* .bin -delta' >> info / attributes
    echo'* .png -delta '>>情報/属性

  • リポジトリを再パックしてゴミを収集する

    git repack -a -d -F --window-memory 100m --max-pack-size 200m
    git gc

アップデート3:

この操作後のいくつかの予期しない副作用:パフォーマンスを向上させるためにgitリポジトリを再パックしようとした後の問題

4

2 に答える 2

6

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

群衆のアドバイスに従ってください:

  1. 大きなバイナリをリポジトリから移動します
  2. 開発環境を仮想マシンイメージに移動します:https ://www.virtualbox.org/
  3. このPythonスクリプトを使用して、これらの大きなバイナリブロブのリポジトリをクリーンアップします(リポジトリで使用しましたが、うまく機能しました) https://gist.github.com/1433794
于 2012-09-18T20:36:22.477 に答える
0

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

于 2012-09-18T20:26:55.750 に答える