magit stage 多个文件异常卡顿

问题描述

修改多个文件后(每个甚至只有十几行),对单个文件 stage 挺快的,但是一旦多于一个文件,就有非常显著的卡顿(大概3-4秒)。同时 unstage/unstage-all 不卡。

背景描述

我在 mac 上使用的,emacs 版本是 30.0.50:

brew install emacs-plus@30 --with-ctags --with-mailutils --with-native-comp

magit 版本也是非常新的,2024-06 的

细节描述

我最开始以为是我配置问题,因此 emacs -Q simple.el 测试了下,也是类似的,其中 simple.el 如下:

(use-package magit
  :defer t
  :ensure t
  :config
  (remove-hook 'magit-status-headers-hook 'magit-insert-tags-header)
  :bind (("C-c m f" . magit-find-file))
  )

我用 profiler 测了下:重复 stage/unstage 5次,report 如下:

报告显示 unstage 占了大头,但实际体验根本不是这样的。 非常疑惑。

同时我也开了 magit verbose refresh 那个看了下,refresh status 大改0.4-0.5秒,和 unstage 耗时类似。

emacs 29 呢?可以在 magit 代码里加上打印时间,一点点 debug 哪里最慢,比如:

(let ((t1 (current-time)))
  ;; around some magit code
  (message "elapsed %fs" (float-time (time-since t1)))

好的,我试一试 :slight_smile:

我在 mac 上 stage 单个文件一直会有一秒左右的卡顿感…

试了下 magit-toggle-verbose-refresh,我的 magit-refresh 也是 0.5s 左右。

看了下还可以 (setq magit-process-extreme-logging t) 打印所有执行的 git 命令。

magit-refresh 总共会执行 25 条,拷到脚本里 time 了一把确实也是 0.5s 左右。

1 个赞

那我倒不会,单个文件至少不卡手,但是但凡多个文件,直接往3,4秒去了