BlogKLabは、多くのスマートフォン向けゲームを開発・提供しています。スマートフォン向けゲームの開発と運用は、Webソーシャルゲームと比べて格段に複雑で、またコンシューマゲーム開発とも異なったノウハウが求められる領域もあります。このブログでは、KLabのゲーム開発・運用の中で培われた様々な技術や挑戦とそのノウハウについて、広く紹介していきます。2015/11/04コマンドラインでgitのブランチ補完が異常に遅い原因を調べた@windowsこんにちは。@kokukumaです。昨日ふと調べたgitのブランチ名補完が異常に遅い原因について書きたいと思います。僕のwindows環境としては、conemuを入れて、その中でgitつかっています。非常に鬱陶しいのが、ブランチの補完が異常に遅いことです。git-complete.bashの中を確認するとりあえず、git-complete.bashの中でどこが遅いのか読んでみます。for-each-refが遅いと察することができます。for-each-refとは、.git内にあるrefsを出力するためのgitコマンドです。詳しくは、for-each-refを参照のこと。以下、gitの挙動を知りたいだけなので、linux上で実施。0m0.496sなぜか、shortつけただけで、すごく時間が伸びています。システムコールを見てみる原因を調べるため、straceを使って実行されているシステムコールのsummaryをとってみます。openatでました。遅い原因となっているlstat。~gitのコードを確認する次に、なぜshortをつけただけでlstatが大量発行されるのかを、gitのコードを追って調べてみます。ここでrefnameを短くしているぽい。ここの中でlstatしてる。nameに変換する作業です。やり方は単に、refs/headsとかに引っかかったら、その部分を削るだけです。短くすると、ブランチ名を一意にsha1に変換できなくなる可能性がでてきます。?そこでshorten_unambiguous_refでは、同じshort_nameで表すことができるrefsがあるか確認して、あったら短くしないと動いています。これによって、for-each-refで出力される結果がすべて、一意にsha1に変換できることを保証しているわけです。sha1を確認するとなっているので、1つのrefsに対して、4、5回lstatを実行しています。そのためレポジトリのブランチが増加すると、lstatの回数が増加して、1TABにつき1万回のlstat発行!とかになります。vboxsf)のlstatが凄く遅いせいで、windowsでブランチ補完が遅くなるという感じ。対応for-each-refを上手く直す方が正しいでしょうが、ちょっと大変そうなので、雑な対応で乗り切ることにしました。:shortつけるのが遅い原因なら、:shortやめてsedでrefs/headを削る作戦。zatu-git-complete.bashこれをすることで、一意にsha1に変換出来ないブランチ名が補完される可能性があります...でもまぁ、remotesには基本originがつくでしょうし、ブランチ名と同じ名前のタグとかつけない(たぶん)ので大丈夫。zatu-git-complete.bashを手元に保存して、.bashrcとかに以下みたいに書いておけば使えます。(保存したpath)/zatu-git-complete.bashまとめなんでwindowsのgitのブランチ補完が遅い原因が分かった。雑対応で雰囲気速くなった。