web-dev-qa-db-ja.com

大規模なプロジェクトでは、DebianとUbuntuでWSLのgitコマンドを実行すると本当に遅い

合計で約15.000コミットの非常に大きなプロジェクトがあります。 WindowsマシンでWSLを使用してDebian 9.3を実行しています。私のgitバージョンは2.17.0です。

git statusなどのコマンドを実行すると、完了するまでに少なくとも20秒かかります。変更がない場合でも。

Gitの古いバージョンを複数試し、Ubuntuも試しましたが、同じ結果が得られます。ここや他のサイトのさまざまな投稿からたくさんのコマンドを実行してみましたが、どれも機能しませんでした。

面白いことに、Windowsでcmd.exeまたはGit Bashを開くと、git statusを実行するのに1秒もかかりません。

何が原因でしょうか?これを修正するにはどうすればよいですか?

12
MortenMoulder

2019年6月の更新: WSL 2が来ます 、およびそれとの完全なシステムコールの互換性。
これにより、Gitコマンドのパフォーマンスが大幅に向上するはずです。


元の回答2018:

中間層のないホストで実行すると、Gitが最もよく機能します。

たとえば、リポジトリが共有フォルダにある場合、Gitはかなり遅くなります。
WSLの場合、リポジトリはローカルでアクセスされますが、さまざまなLinuxファイルシステム操作とNTカーネル操作の間で filesystem translation を介してアクセスされます。

translation

これは、パフォーマンスの低下を説明するには十分です。特に大規模なGitリポジトリの場合は、$PATHがLinuxの代わりに呼び出されるWindows実行可能ファイルを含むフォルダーを参照しないようにしてください

考えられる原因:

  • ファイルシステムエミュレーション(遅い): WSL問題2759
  • シェルプロンプト :複雑なPS1計算を行わずに、基本的なシェルプロンプトでコマンドをテストしてください
  • Windows Defender AV :WSLで管理されたファイルシステムをAVスキャンから除外します(テスト用)。
4
VonC

Ubuntuを使用した私のWSLでは、最初の「git status」コマンドは2番目のコマンドよりもはるかに低速です。おそらく、最初の実行時にキャッシングまたは索引付けが行われています。 2番目の「gitステータス」の速度は私には問題ありません。

2
jepster

GIT_TRACE_PERFORMANCE env var:

$ GIT_TRACE_PERFORMANCE=1 git status -sb -uno
08:51:54.525808 read-cache.c:1889       performance: 0.000330659 s: read cache .git/index
08:51:54.528532 preload-index.c:112     performance: 0.002669928 s: preload index
08:51:54.528667 read-cache.c:1447       performance: 0.000109768 s: refresh index
08:51:54.528892 diff-lib.c:250          performance: 0.000056516 s: diff-files
08:51:54.534630 diff-lib.c:527          performance: 0.005070461 s: diff-index
## wip/foo
08:51:54.536419 trace.c:420             performance: 0.013503141 s: git command: git status -sb -uno
1
LeGEC

ラン

time git clone https://github.com/git/git.git

そして

time git clone git git.1

現在のWSLのThinkpad T460では、 MSYS2 およびvirtualboxed Fedora 28(guiなし、PuTTY)。

ローカルクローンのリアルタイムは

Fedora 3s, WSL 67s, MSYS2 65s

Defenderをオフにした後、時間は

WSL 11s, MSYS2 13s

そう

  • GUIなしのVirtualBoxed Fedoraが最速
  • Defenderは高価です。 git作業ルートを除外します。
  • wSL git作業ディレクトリが〜または/ c/mntの下にある場合、実用的な違いは見つかりませんでした

少しテストを繰り返してください。

0
weberjn