web-dev-qa-db-ja.com

git stashはWindowsで遅い

私のWindowsマシンでgit stashは各呼び出しで約3.5秒のオーバーヘッドがあり、これによりgit commitフックに約7秒が追加されます。

Linux(同じマシン)での同じコマンドには、約0.01秒かかります。パフォーマンスの問題は、空のリポジトリにも当てはまります。

this thread および this thread から以下を試しました:

  • core.fscachetrueに設定されます
  • core.preloadindextrueに設定されます
  • gc.auto に設定されています 256
  • PS1 = '$'の設定
  • 管理モードでcmdを実行する
  • Git-bashの代わりにcmd.exe内で実行

ランニング GIT_TRACE=true git stash list

16:58:16.844591 git.c:563               trace: exec: 'git-stash' 'list'
16:58:16.844591 run-command.c:336       trace: run_command: 'git-stash' 'list'
16:58:19.699591 git.c:350               trace: built-in: git 'rev-parse' '--git-dir'
16:58:19.859591 git.c:350               trace: built-in: git 'rev-parse' '--git-path' 'objects'
16:58:20.069591 git.c:350               trace: built-in: git 'rev-parse' '--show-toplevel'
16:58:20.154591 git.c:350               trace: built-in: git 'rev-parse' '--git-path' 'index'
16:58:20.244591 git.c:350               trace: built-in: git 'config' '--get-colorbool' 'color.interactive'
16:58:20.334591 git.c:350               trace: built-in: git 'config' '--get-color' 'color.interactive.help' 'red bold'
16:58:20.424591 git.c:350               trace: built-in: git 'config' '--get-color' '' 'reset'
16:58:20.514591 git.c:350               trace: built-in: git 'rev-parse' '--verify' '--quiet' 'refs/stash'

real    0m3.845s
user    0m0.000s
sys     0m0.047s

ランニング GIT_TRACE_PERFORMANCE=true git stash list

16:59:18.414591 trace.c:420             performance: 0.001078046 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'rev-parse' '--git-dir'                                          
16:59:18.569591 trace.c:420             performance: 0.000947184 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'rev-parse' '--git-path' 'objects'                               
16:59:18.779591 trace.c:420             performance: 0.001253627 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'rev-parse' '--show-toplevel'                                    
16:59:18.869591 trace.c:420             performance: 0.001285517 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'rev-parse' '--git-path' 'index'                                 
16:59:18.955591 trace.c:420             performance: 0.001139994 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'config' '--get-colorbool' 'color.interactive'                   
16:59:19.040591 trace.c:420             performance: 0.001182881 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'config' '--get-color' 'color.interactive.help' 'red bold'       
16:59:19.125591 trace.c:420             performance: 0.001128997 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'config' '--get-color' '' 'reset'                                
16:59:19.215591 trace.c:420             performance: 0.001567766 s: git command: 'C:\Program Files\Git\mingw64\libexec\git-core\git.exe' 'rev-parse' '--verify' '--quiet' 'refs/stash'                    
16:59:19.295591 trace.c:420             performance: 3.730583540 s: git command: 'C:\Program Files\Git\mingw64\bin\git.exe' 'stash' 'list'                                                                

real    0m3.819s                                                                                                                                                                                          
user    0m0.000s                                                                                                                                                                                          
sys     0m0.062s                                                                                                                                                                                          

ログから、git-stashコマンドが実行されてからgit-rev-parseが実行されるまでに約3秒かかることがわかります。ボトルネックを見つけるために実行できる他のフラグはありますか?

50
sighol

git-stashはスクリプトであり、git.exeバイナリでコンパイルされたコマンドではありません。

Linuxの場合:git-stash/usr/lib/git-core/git-stashを見つけることができます-Windowsで正しいパスを検索できます...


このスクリプトは#!/bin/shを使用して実行されますが、Windowsでこれを実行するときにどのシェル実装が使用されるのかわかりません。

別の互換性のあるシェル(ここではbash)で実行することができます:

# the git-core/ dir needs to be in the PATH,
# obviously  you will need to provide the correct path for your git-core dir

$ PATH=/usr/lib/git-core:$PATH bash /usr/lib/git-core/git-stash

-xフラグをオンにして、実行されたすべてのコマンドのトレースを出力し、サブコマンドの1つがハンガーのように見えるかどうかを視覚的に確認することもできます。

$ PATH=/usr/lib/git-core:$PATH bash -x /usr/lib/git-core/git-stash
3
LeGEC