2013-06-02 18 views
8

Magitはファイルのコミットに非常に時間がかかります。他のタスクと絶対に不均衡です - 数分かかるかもしれません。そうでなければ、私はあきらめてシェルからコミットします。何か理由はありますか?どうすればデバッグできますか?興味深いことに、私が*magit-process*バッファ(gitプロセスとやり取りしなければならないもの)をkillしてから、タスクを続行すると、すべてが動作します。しかし、そのバッファにエラーメッセージはなく、コマンド自体です。WindowsでコミットするときMagitが非常に遅い

+0

私は何かタイムアウトしていると思うかもしれませんが、潜在的にあなたが開いているバッファの数で乗算されるかもしれません。これについての未解決の問題)、これはそうでなければ魔法が速くても非常に目立つことがあります。 Emacsの新しいインスタンスで最低限のバッファを開いてテストを繰り返すことは価値があるかもしれません。 – phils

+0

私は分については分かりませんが、間違いなく窓にmagitが間違っています。これは、非同期と関係があると思われる。私はそれをプロファイリングし、私は非常に奇妙な結果を得ています。私はそれを修正できるまで私は見ていきます。 –

+0

私はそれを少しだけプロファイリングしました...それは、magitがgit *で多くの*プロセスファイル(同期している)を呼び出しているようです。それは非常に遅くなります。特に、ファイルの単一の隠し文字に対して5回rev-parseを呼び出します。それは過度に思える。 –

答えて

7

M-xは

の変更をあなたのgitの実行可能ファイルへのフルパスに値をRET magit-gitの実行RET-VARのカスタマイズ。たとえば私はmineをc:/cygwin/bin/git.exeに設定します。私がそれをする前は、魔法は痛いほど遅かった...今はちょっと遅いです。

+1

これは実際にOS Xでも私を助けてくれました。私はgitをハブコマンドとして包むoh-my-zshバンドルでzshとzshのgithubプラグインを使用していました。 – ustun

5

git.exeパスを追加するだけでは、magitのスピードがあまり向上しませんでした。

最良の方法は、[1]

(if (eq system-type 'windows-nt) 
    (progn 
     (setq exec-path (add-to-list 'exec-path "C:/Program Files (x86)/Git/bin")) 
     (setenv "PATH" (concat "C:\\Program Files (x86)\\Git\\bin;" (getenv "PATH"))))) 

EXECパスがMagitために重要である、のsetenvをESHELLにより使用され、次の構成を持つすべてのgit関連コマンドパスを追加です。

私の環境(Windows 7 x64)では、magit-statusのコストは1〜2分ではなく約2秒です。

[1] https://lists.gnu.org/archive/html/emacs-devel/2012-05/msg00269.html

3

それが原因で、それが書かれているとWindowsがプロセスを開始するには、UNIXシステムよりもわずかに遅いという方法を組み合わせて遅いです。

Magitは、同期プロセスに大きく依存し、ステータスページを表示します。ここで私は、単一のstage-item実行から構築され、いくつかの出力があります:

magit-cmd-output git.exe (--no-pager symbolic-ref -q HEAD) (0 1 153000 0) {refs/heads/master} 
magit-cmd-output git.exe (--no-pager config branch.master.remote) (0 1 149000 0) {} 
magit-cmd-output git.exe (--no-pager config --bool branch.master.rebase) (0 1 155000 0) {} 
magit-cmd-output git.exe (--no-pager config branch.master.merge) (0 1 155000 0) {} 
magit-cmd-output git.exe (--no-pager log --max-count=1 --abbrev-commit --abbrev=7 --pretty=oneline) (0 1 168000 0) {} 
magit-cmd-output git.exe (--no-pager stash list) (0 2 831000 0) {} 
magit-cmd-output git.exe (--no-pager config status.showUntrackedFiles) (0 1 177000 0) {} 
magit-cmd-output git.exe (--no-pager ls-files --others -t --exclude-standard) (0 1 195000 0) {? thehangover.jpg? tugofwar.jpg? tugogwar.jpg? typists.jpg} 
magit-cmd-output git.exe (--no-pager diff-files) (0 1 158000 0) {} 
magit-cmd-output git.exe (--no-pager mktree) (0 1 157000 0) {4b825dc642cb6eb9a060e54bf8d69288fbee4904} 
magit-cmd-output git.exe (--no-pager diff-index --cached 4b825dc642cb6eb9a060e54bf8d69288fbee4904) (0 1 156000 0) {:000000 

(注意:これはすでに最適化されて、私は最悪冗長呼び出しを削除しました)。

ここでは、magitがそれぞれの引数セットに対してgitを呼び出していることが分かります.1秒と非常に多くのマイクロ秒を要しています。最悪の場合(stash list)、ほぼ3秒です。それはすべて加算され、非常に遅くなります。

おそらく、これらのコールの多くはキャッシュされている可能性があります。しかし、困難なことは、それらをキャッシュしないときです。それはうまくいくためには魔法に多くの変更が必要です。

もう一度バッチ処理する方法がありますので、すばやく処理できますか?多分。今はそんなことは考えられない。おそらく特別なgit実行可能ファイルがそれを利用可能にするでしょうか?

+0

この呼び出しをどのようにプロファイルしましたか? Windowsでmagitを使ってほとんど何もするのに30秒以上かかるので、何が遅いのか見たいと思っています。 –