Magit 需要很长时间来提交文件。与任何其他任务绝对不成比例 - 可能需要几分钟,否则我会放弃并从 shell 提交它。有什么理由吗?我该如何调试它?有趣的是,如果我杀死*magit-process*
缓冲区(必须与 git 进程交互的缓冲区),然后继续执行任务,那么一切正常。但是该缓冲区中没有错误消息,只有命令本身。
5 回答
M-x customize-var
RET magit-git-executable
RET
将值更改为 git 可执行文件的完整路径。例如,我将我的设置为c:/cygwin/bin/git.exe
. 在我这样做之前,magit 非常缓慢......现在它只是有点慢。
如果只添加 git.exe 路径,magit 并没有加速太多。
最好的方法是使用以下配置添加所有与 git 相关的命令路径 [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-path 对 Magit 很重要,setenv 由 eshell 使用。
在我的环境(Windows 7 x64)中,magit-status 只需要大约 2 秒而不是 1~2 分钟。
[1] https://lists.gnu.org/archive/html/emacs-devel/2012-05/msg00269.html
它很慢,因为它的编写方式和 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 秒。这一切加起来,使它变得非常缓慢。
很多这些调用可能会被缓存。但困难的是何时取消缓存它们。这将需要对 magit 进行大量更改才能做得很好。
或者,是否有一种方法可以将它们批量化,以便它们更快?也许。目前想不出这样的办法。也许一个特殊的 git 可执行文件可以使它可用?
更改 magit-git-executable 对我没有任何作用。我最终使用了 WSL,在它上面安装了 X 并在 Windows 上安装了一个瘦 XServer。它实际上工作得非常非常好,并且比“原生”Windows10、Cygwin 和 MingSYS 快得多
一些好的分步说明在这里: https ://github.com/hubisan/emacs-wsl
正如 MikeHoss 所指出的,对于 magit,WSL Emacs 是更好的选择。
检查我所做的一些比较,原生Emacs Windows 与 WSL Emacs: