2012-03-12 11 views
5

私はGitの下に置くテストリポジトリを持っています。ほとんどのファイルはかなり小さいですが、非常に多数あり、単にaddやstatusなどのGit操作が完了するまでに数十分かかります。これらをリビジョン管理下に置き、合理的なパフォーマンスを得るための私の選択肢は何ですか?サブモジュールを使用するか、DVCSをクリアする必要がありますか?遅いGit操作

+0

どのような種類のファイルシステムを使用していますか? – Useless

+3

Gitは大きなプロジェクトを高速で処理できることが知られています。低速ファイルシステムを使用していますか? –

+0

マウントはNFS経由ですが、ヘッドはかなりハイエンドです。 – dromodel

答えて

12

addstatusのようなギット操作では、ファイルシステム内のすべてのファイルを(変更を検出するために)必要とします。本当に膨大な数のファイル(たとえば、数十万または数十万のファイル)を持っているか、どちらかというと遅いファイルシステムを持っていますか?stat

いずれにしても、これが極端に遅いシステムで作業する必要がある場合は、インデックスに "変更されていない"ビットを使用して、Gitにファイルstatを送信しないように指示できます。これをオンにすると、個々のファイルの変更を手に入れるようにgitに手動で指示する必要があります。それらを直接git addに渡すことによって、Gitは何も変わったことを知ることさえできません。 git config core.ignoreStat trueを設定し、次にgit reset --hard HEADのようなものを実行して、これを有効にすることができます。

+0

ビンゴ!私は恐れているので私はそれらを数えませんでしたが、人間が生成した数十万〜数百万のファイルであることを発見しても驚くことはありません。私はそのフラグを設定しようとしたが、それはいくつかの操作で少し助けても、まだ遅すぎる。たぶん私は代わりに大量の小さなリポジトリを作成する必要があります。 – dromodel

7

「非常に大きい」数字は何ですか?通常はgitが厄介なものを見つける小さなファイルの量ではなく、大きなバイナリファイルです。しかし、その量が十分に大きければ、サブモジュールや他の方法でいくつかのリポジトリに分割したいと思っています。 1つのリポジトリに存在する必要がある場合は、たとえばSubversionがよりパフォーマンスに優れていることがわかります。

EDIT:okだから、ここではボトルネックのように思えるNFSマウントを使用するというコメントを追加しました。 this threadの解決方法をご確認ください。特にここではcore.preloadindexが関心の対象です。 the documentationから

:ファイルシステム上の

core.preloadindex

のgit diffのよう

を操作に対する並列インデックス・プリロードを有効にします。これは、Gitの差分とgitのステータスのような操作をスピードアップすることができ、特に NFSのように弱いキャッシュセマンティクスを持っているため、比較的高いIOレイテンシを持っています。これをtrueに設定すると、gitは のファイルシステムデータとのインデックス比較を並列に実行し、 のIOが重複します。

EDIT2:コメントに6百万のファイルが記載されています。私はこれがボトルネックになることを理解することができます - それは確かに非常に大量です。

+0

私はSVNがgitよりもパフォーマンスが良いと疑っています。たとえそれがあったとしても、gitははるかに優れています(Linus Torvaldsによれば、Gitを使用していないときは醜いですね:p) – ThiefMaster

+0

まあ、 Linus [同意](http://stackoverflow.com/questions/984707/what-are-the-git-limits)でさえ、いくつかのユースケースではこれが状況だと言います。 Gitはリポジトリ全体で動作するため、いくつかのシナリオでは最良の選択肢ではありません。 – eis

+0

バイナリファイルはほとんどありません。ファイルの数は、単一のオープンソースプロジェクトで見つかった数よりも大幅に多くなります。 – dromodel

関連する問題