2013-06-02 28 views
8

Magit mất rất nhiều thời gian để thực hiện một tệp. Hoàn toàn không cân xứng với bất kỳ tác vụ nào khác - có thể mất vài phút, nếu không tôi sẽ từ bỏ và cam kết nó khỏi trình bao. Có lý do gì không? Làm thế nào tôi có thể gỡ lỗi nó? Điều thú vị là, nếu tôi giết *magit-process* bộ đệm (bộ đệm phải tương tác với quá trình git), và sau đó tiếp tục với tác vụ, sau đó mọi thứ hoạt động. Nhưng không có thông báo lỗi trong bộ đệm đó, chỉ là lệnh.Magit rất chậm khi cam kết trên Windows

+0

Tôi cho rằng có gì đó đã hết thời gian, nhưng nó * cũng có thể được nhân với số lượng bộ đệm bạn đã mở, vào các thời điểm khác nhau (kể cả khi bạn cam kết) magit sẽ thực hiện một số xử lý trên tất cả các bộ đệm mở một vấn đề mở về điều này), có thể rất đáng chú ý ngay cả khi magit là nhanh. Nó có thể là đáng giá lặp đi lặp lại thử nghiệm trong một ví dụ Emacs mới với bộ đệm tối thiểu mở, và xem nếu điều đó cải thiện hiệu suất ở tất cả? – phils

+0

Tôi không biết về phút nhưng chắc chắn có điều gì đó sai với magit trên cửa sổ. Nó dường như là một cái gì đó để làm với không đồng bộ. Tôi đã lược tả nó và tôi nhận được kết quả rất lạ. Tôi sẽ tiếp tục tìm đến khi tôi có thể sửa nó. –

+0

Tôi chỉ lược tả nó một chút ... có vẻ như magit đang gọi quá trình tập tin (mà là đồng bộ) trên git * rất nhiều *. Điều đó làm cho nó khá chậm. Cụ thể là nó gọi rev-parse 5 lần cho một stash duy nhất của một tập tin. Điều đó có vẻ quá mức. –

Trả lời

7

M-x tùy chỉnh-var RET magit-git-thực thi RET

Thay đổi giá trị thành đường dẫn đầy đủ để thực thi git của bạn. Ví dụ tôi đặt mỏ của tôi thành c: /cygwin/bin/git.exe. Trước khi tôi làm điều đó, pháp sư rất chậm chạp ... bây giờ nó hơi chậm một chút.

+1

Điều này thực sự đã giúp tôi trên OS X quá, tôi đã sử dụng zsh và zsh của github plugin trong gói oh-my-zsh của tôi mà kết thúc tốt đẹp git như một lệnh trung tâm. – ustun

5

Magit không tăng tốc rất nhiều, nếu chỉ thêm đường dẫn git.exe.

Cách tốt nhất là thêm tất cả git liên quan đường lệnh với cấu hình như sau [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-đường là quan trọng đối với Magit, setenv được sử dụng bởi eshell.

Trong môi trường của tôi (Windows 7 x64), trạng thái magit chỉ tốn khoảng 2s thay vì 1 ~ 2 phút.

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

3

Đó là chậm vì một sự kết hợp của cách thức mà nó được viết và Windows là hơi chậm hơn so với các hệ thống unix để bắt đầu quá trình.

Magit phụ thuộc nhiều vào các quy trình đồng bộ để hiển thị trang trạng thái. Dưới đây là một số kết quả tôi xây dựng từ một stage-item chạy duy nhất:

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 

(lưu ý: đây đã được tối ưu hóa, tôi đã gỡ bỏ các cuộc gọi không cần thiết tồi tệ nhất).

Bạn có thể thấy ở đây rằng magit đang gọi git cho từng bộ đối số đó và nó mất 1 giây và rất nhiều micro giây. Trong trường hợp xấu nhất (stash list) gần 3 giây. Tất cả đều tăng lên và làm cho nó rất chậm.

Rất nhiều cuộc gọi đó có thể được lưu trong bộ nhớ cache. Nhưng điều khó khăn là khi phải cởi mở chúng. Điều đó đòi hỏi rất nhiều thay đổi để có thể làm tốt.

Cách khác là có cách trộn chúng lại để chúng nhanh hơn? Có lẽ. Không thể nghĩ như vậy ngay bây giờ. Có lẽ một git thực thi đặc biệt có thể làm cho có sẵn?

+0

Bạn đã định cấu hình cuộc gọi này như thế nào? Mất 30 giây để tôi làm hầu hết mọi thứ với magit trên Windows và tôi muốn xem điều gì quá chậm. –