2013-06-02 12 views
8

Magit impiega molto tempo a caricare un file. Assolutamente sproporzionato rispetto a qualsiasi altro compito - può richiedere diversi minuti, altrimenti mi arrendo e lo commetto dalla shell. C'è qualche ragione? Come posso eseguirne il debug? È interessante notare che se uccido il buffer *magit-process* (quello che deve interagire con il processo git) e poi continua con l'attività, allora tutto funziona. Ma non ci sono messaggi di errore in quel buffer, solo il comando stesso.Magit è molto lento quando si esegue il commit su Windows

+0

Suppongo che qualcosa stia scadendo, ma * potrebbe * potenzialmente moltiplicato anche per il numero di buffer che hai aperto, poiché in momenti diversi (incluso quando si esegue il commit) Magit eseguirà qualche elaborazione su tutti i buffer aperti (c'è un problema aperto su questo), che può essere molto evidente anche quando il magit è altrimenti veloce. Potrebbe valere la pena ripetere il test in una nuova istanza di Emacs con i buffer minimi aperti e vedere se ciò migliora le prestazioni? – phils

+0

Non conosco i minuti ma sicuramente qualcosa non va con Magit su Windows. Sembra che abbia a che fare con l'asincronia. L'ho profilato e sto ottenendo risultati molto strani. Continuerò a cercare finché non riesco a risolverlo. –

+0

Ho appena profilato un po '... sembra che Magit stia chiamando un file di processo (che è sincrono) su git * molto *. Questo lo rende piuttosto lento. In particolare chiama rev-parse 5 volte per una singola sequenza di un file. Sembra eccessivo. –

risposta

7

M-x personalizzare-var RET magit-git-eseguibile RET

Modificare il valore per il percorso completo dell'eseguibile git. Per esempio ho impostato il mio in c: /cygwin/bin/git.exe. Prima che lo facessi, magit era dolorosamente lento ... ora è solo un po 'lento.

+1

Questo in realtà mi ha aiutato anche su OS X, stavo usando il plugin github di zsh e zsh nel pacchetto oh-my-zsh che avvolge git come un comando hub. – ustun

5

Il magit non ha accelerato molto, se solo si aggiungesse il percorso git.exe.

Il modo migliore è aggiungere tutti percorso dei comandi correlati git con seguente configurazione [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-percorso è importante per Magit, setenv è utilizzato da eshell.

Nel mio ambiente (Windows 7 x64), lo stato di magit costa solo 2 secondi anziché 1 ~ 2 minuti.

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

3

E 'lento a causa di una combinazione del modo in cui è scritto e Windows essendo leggermente più lento rispetto ai sistemi UNIX per avviare i processi.

Magit dipende in gran parte dai processi sincroni per visualizzare la pagina di stato. Ecco un output ho costruito da un singolo stage-item corsa:

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 

(nota: questo è già ottimizzata, ho rimosso peggiori chiamate ridondanti).

Puoi vedere qui che Magit chiama git per ciascuno di questi set di argomenti e impiega 1 secondo e così tanti microsecondi. Nel peggiore dei casi (il stash list) quasi 3 secondi. Tutto sommato e lo rende molto lento.

Molte di queste chiamate potrebbero essere memorizzate nella cache. Ma la cosa difficile sarebbe quando eliminarli. Ciò richiederebbe un sacco di cambiamenti in Magit per fare bene.

In alternativa ci sarebbe un modo per raggrupparli in modo che siano più veloci? Può essere. Non riesco a pensare in questo modo adesso. Forse un eseguibile git speciale potrebbe renderlo disponibile?

+0

Come hai definito questa chiamata? Mi ci vogliono 30 secondi per fare quasi tutto con Magit su Windows e mi piacerebbe vedere cosa è così lento. –