讨论一下 Borg

多谢分享,这个很有用。

同时,再继续体验一下 Borg,弄一个常用的最小配置,其实平时好多包都用不到😓

我好想没咋用过这个函数,包括和magit的整合,都太麻烦了我觉得。

submodule 加一次就行了,我都是直接 submodule add 添加的,基本不在emacs里面使用borg,

在命令行添加,删除,编译submodule.

我好像189个包,启动2s多,启动时间对我无所谓的。

我昨晚手动 borg-clone 一个个加了,反正就弄一次。

升级子模块知道是对应哪个命令吗?文档好像没看到。

包括和magit的整合,都太麻烦了我觉得。

把magit 整的很慢,Mac 上也是。

慢是因为要把 submodule的 section也要插入进去:

 (magit-add-section-hook 'magit-status-sections-hook
                          'magit-insert-modules
                          'magit-insert-stashes
                          'append))

我的做法是init.el只保留一个模板,平时几乎不动,只有包改变时需要在此目录下打开magit。转而将其他配置也搞成一个包,放github上,这样在这个目录下用magit还是很快的,跟平时没区别。

我的240个包,安了杀毒软件,在.emacs.d目录下调用 magit-status,竟然要40多秒

我现在将 Magit 的配置改成下面这样,只是 commit 的时候有点延迟 1s 左右(windows 系统下),你的 40s 有点夸张啊。

    ;; Add modules in magit status buffer:
    (magit-add-section-hook 'magit-status-sections-hook
                            'magit-insert-modules
                            'magit-insert-unpulled-from-upstream)

默认模板项目是会编译 init.el 到 init.elc,会不会是这个造成比较慢的。因为这样每次修改 init.el 文件都会触发 auto-compile?

我在文件末尾加入了这个变量:

;; no-byte-compile: t

升级子模块, borg应该是希望你用magit-submodule-update吧? 我不用magit管理borg,无论你怎么优化,超过几十个包他就是慢,优化没有意义。

我设定了一个阈值,超过20个子模块,diff的时候就自动排除,否则的话stage一个变动都要3s。

优化magit-status diff with submodules

  ;; HACK ignore submodules in magit-status when there is too many submodules.
  (defvar magit-status-submodule-max 20
    "Maximum number of submodules that will be not ignored in `magit-status'.")
  (defun ad/ignore-submodules-more-than-max (orig-fn &rest args)
    (let ((default-directory (magit-toplevel)))
      (if (< magit-status-submodule-max (length (magit-list-module-paths)))
          ;; SEE https://emacs.stackexchange.com/a/57594/35676
          (cl-letf (((get 'magit-status-mode 'magit-diff-default-arguments)
                     (cl-pushnew
                      "--ignore-submodules=all"
                      (get 'magit-status-mode 'magit-diff-default-arguments))))
            (apply orig-fn args))
        (apply orig-fn args))))
  (advice-add 'magit-diff--get-value :around #'ad/ignore-submodules-more-than-max)

我说的直白一点,现阶段使用magit-submodule就是在找罪受,命令行包装一下命令感觉更好。

3 个赞

也不全是插入submodule的锅,即便你不插入,magit-diff需要检查包是否变动,依然很慢。

即便你真的要插入 module,我也建议你设置一下:

隐藏module-overview加快magit-status加载速度

  ;; disable `magit-insert-modules-overview'
  (setq magit-module-sections-hook
        '(magit-insert-modules-unpulled-from-upstream
          magit-insert-modules-unpulled-from-pushremote
          magit-insert-modules-unpushed-to-upstream
          magit-insert-modules-unpushed-to-pushremote))
  ;; add module in `magit-status'
  (magit-add-section-hook 'magit-status-sections-hook
                          'magit-insert-modules
                          'magit-insert-untracked-files)
  )

遇到一个问题: borg-clone 没法克隆 undo-tree 这个包,大家有遇到过吗?

Cloning into 'lib/undo-tree'...
ssh_askpass: exec(/usr/lib/ssh/ssh-askpass): No such file or directory
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

你这不是提醒是ssh的问题嘛

为什么其他的包都没问题,就这个包要走 ssh-askpass,undo-tree 不是也在github 仓库上吗?

我不太清楚,我不用undo-tree。。我用的是undohist+vundo

谢谢,好像快了一些。我看了下CPU,慢的锅应该是360,magit-status执行时360的进程也在执行。

全部迁移到 Borg 了,启动速度还是很快的,1.2s 左右,和 package.el 差不多。

开始不熟悉, borg-cloneborg-assimilate, 再 borg-build

其实,先 epkg-describe-package 查看包的依赖关系,然后只要 borg-assimilate 就可以安装包了,它会自动 clone 并 build。装好再加配置并commit。

borg-clone 是给只想克隆,不想编译用的。 borg-build 是给 borg-assimilate 出错,想重新编译用的。

不需要的包用 borg-remove 移除。

总的来说,就是自己管理依赖,手动安装。

剩下的问题:

  1. 由于缺少 ssh-askpass 没发安装 undo-tree 和 git-timemachine (这个不能缺)
  2. 在 Mac 上 Magit commit 非常慢,比 Windows 还慢了,有待解决。 反而是 Windows 下是正常(跟以前一样慢 :sweat:
3 个赞

这个问题已经解决,原因是我从来没用 ssh 下载过 gitlab 仓库,所以 ssh 的 ~/.ssh/known_hosts 没有加 gitlab.com。 只要在终端里下载一次 gitlab 的项目就 OK了。然后 Borg 就可以正常 Clone

我是直接用https,没用ssh。配置下 borg-rewrite-urls-alist:

(setq borg-rewrite-urls-alist
      '(("[email protected]:" . "https://github.com/")
        ("[email protected]:" . "https://gitlab.com/")))

以前我的Git 都是用 https,每次都要提示我输入密码。加上前段时间(好像是半年前)Github 提示不允许用 https+普通密码 给自己仓库推送commit,于是就弄了 ssh。

用 HTTPS 是怎么做到不用手输密码的? 用GPG 吗?

在github的 1. Settings → Developer settings,创建一个 Personal access tokens。然后push url的格式:https://user:[email protected]/xxx.git

国内的gitee也是可以创建这种https token的,gitlab就没试过了。

多谢,原来 Github 是要用户用这个 Personal access tokens, 之前只用过在 CI 上用。

再请教一个问题,对基于 Borg 的 .emacs.d ,A 机器和B 机器都已经同步了 Github 上的仓库,当 A 机器添加了更多的包并推送到 Github 后,B 机器拉取更新。接下正确的方式应该是执行什么命令让本B机器的本地子模块进行更新?

我试过在B机器上执行 make bootstrapmake all ,以及 git submodule update --init --recursive 都不对。

在 B 机器上全新安装倒是没问题的,但是那样太慢了。

git submodule update --init lib/reponame

我记得是这样,在magit中也可以操作的,不过我的实在太慢。这个命令拉到包以后,运行一次 borg-build