2016-09-22 15 views
3

数十万のファイル、数千のディレクトリ、多くのGbデータを持つ作業ディレクトリを含むようにリポジトリを設定しました。このディレクトリはsamba共有にあります。私はバージョン管理下にこのディレクトリ内に数十のソースファイルを置いておきたいだけです。私は以下のようなものをgitignoreファイルを設定していると、それが動作多くの無視されたファイルで非常に遅い

# Ignore everything 
* 

# Except a couple of files in any directory 
!*.pin 
!*.bsh 
!*/ 

操作(例えばコミットなど)のリポジトリには、実行するために、いくつかの分かかります。これは長すぎるため合理的に作業を完了できません。私は、gitが更新されているかもしれないファイルを探しているすべてのディレクトリを辿っているので、減速が起こっていると思う。

あり、私は私が追跡したいファイルを持つ作業ディレクトリ内の唯一の少数の場所があるので、私はこのクエリを使用して検討するファイルのセットを絞り込むしようとした:

* 
!/version_2/analysis/abcd.pin 
!/version_2/analysis/*.bsh 
!*/ 

これも動作しますしかし、それはまだ適格でないgitignoreほど遅いです。私はそれがキラーである最終行だと推測していますが、どのようにunignoreパターンを非常に特殊なものにしようと試みても、プロセスがコミットするファイルを見つけるために常に最終的なワイルドカード句を含める必要がありました。

だから私の2つの部分の質問は

1)のみ関連含むディレクトリとファイルの種類の非常に狭いセットを含むことによってコミットプロセスをスピードアップするのに役立ちますgitignoreファイルを設定するためのより良い方法はありますです結果?

2)この作業をより効率的にするために必要な、gitやsambaのいくつかの調整がありますか?少なくとも、ないあなたのレポを再構築せずに - あなたは、残念ながら、これについてできることがたくさんありません

おかげで、

トム

+3

なぜこれらの巨大なフォルダの外にファイルを移動し、シンボリックリンクを使用してその中に「保管」しないのですか?次に、実際のフォルダに新しいgitリポジトリを設定することができます。 – manuerumx

+1

'git add -u'はすでにインデックスにあるファイルのみをチェックします。 – Gregg

+0

私はすべてを無視し、手動で目的のファイルをバージョン管理することを考えました。これは、ファイルを追加するのを忘れないようにするためにはあまり望ましくありません。私はこれを使って、バージョン管理の価値があるファイルを自動的に表示することを望んでいました。 – opeongo

答えて

0

。あなたの仮定は正しい - 個々のファイルがたくさんある非常に大きな作業ツリーを持っているので、gitはすべてそれらを通ってトロールしています。そして、あなたの.gitignoreを調整することは助けになりません - 内部では、私が知る限り、gitはそれぞれのフォルダパスの次にあり、.gitignoreで指定されたパターンに一致するファイル(フォルダではない)だけを無視します。

そして、これはネットワークシェア上にあるという事実によってかなり悪化しています。つまり、ファイルシステムを行き来するたびに多くの "標準"が作られます。git操作)は、ネットワークレイテンシのスピードで行われます(1ファイルあたり数ミリ秒ですら何千ものファイルが集計されます)。

残念ながら、ファイルサイズがここで問題になるとは思わないので、コメント(symlinking)に示された提案は、あなたの減速要因がファイル。

あなたができることは、レポジトリの外にあるすべての未追跡のファイルを移動することです。ファイルの数が膨大なものになった場合、大幅な高速化が可能になります。これは必ずしも可能ではないかもしれませんが、あなたのローカルマシンにリポジトリを移動することはできません(これは必ずしも可能ではないかもしれません)。

+0

私はgitワークフローを既存のシステムに改造しようとしているので、作業ディレクトリを再配置したりローカルにするのは現実的ではありません。この作業ディレクトリには、データ、シミュレーションスクリプト、およびシミュレーション結果が含まれています。私はちょうど少数であり、少数のディレクトリにしか置かれていないシミュレーションスクリプトにバージョン管理を加えることを望んでいました。 – opeongo

3

ちょっと騒がしくなった後、私は.gitignoreファイルを変更するだけでパフォーマンスを大幅に改善する方法を見つけました。

パフォーマンスの問題は、すべてを無視して無視する対象を指定する私のアプローチによって発生しました。これには簡潔な仕様(4行)がありましたが、実際は遅かったです。 gitは何が変更されたかを検出するために、ディレクトリツリー全体を移動させました。

私の新しい改善されたアプローチは除外パターンを使用することです。これを使って私はツリーの大きな枝を示すことができます。除外する文書やファイルタイプをもっと長く設定する必要がありましたが、これは数が多いので適切になるには数回繰り返しました。新しいファイルタイプが表示された場合、データセットの性質上、将来的に必要となるファイルは、.gitignoreのメンテナンスが増える可能性がありますが、これはお支払いいただく小さな値段です。ここで

は私の最後の.gitignoreファイルがどのように見えるかのようなものです:

# prune large input data and results folders where ever they occur 
../data/ 
../results/ 

# Exclude document types that don't need versioning, 
# leaving only the types of interest 
*~ 
*# 
*.csv 
*.doc 
*.docx 
*.gif 
*.htm 
*.html 
*.ini 
*.jpg 
*.odt 
*.pdf 
*.png 
*.ppt 
*.pptx 
*.xls 
*.xlsx 
*.xlsm 
*.xml 
*.rar 
*.zip 

は回をコミットダウン数秒になりました。

全体的にこれはまだかなり簡単ですが、最初の4ライナーほどきれいではありません。

私の問題は、自分の早すぎる最適化の犠牲になったということでした。

関連する問題