emacs-在Windows上使用majutsu管理git
想必使用Emacs的你,应该听说过Git。虽然功能强大且成为了现代社区开发的基石之一,但Git的使用难度着实不低。幸好,我们Emacs上有一个伟大的pcakage Magit ,可以极大程度提升Git使用幸福度。
然而在Windows上,Magit的性能相当差,根据有关讨论,主要是因为magit会运行大量 git 进程来收集所需信息,而Windows上创建进程的代价又相对较高。
时间来到了2025年,在Rewrite It In Rust的风潮中,许多经典的Linux工具被Rust重写,而Git也有一个以Rust编写的相似软件:Jujutsu。简单来说,jj能够管理Git的repo,采用了简化一点的设计思路,当然也有缺少的功能。不过最重要的是,在Windows上用Majutsu+Jujutsu比Magit+Git响应速度更快。
1. 配置Git、Jujutsu
Jujutsu需要和Git一起安装,在管理repo之后也会调用Git进行push/fetch等操作。
根据这篇帖子,Windows上的Git不能用scoop安装,需要下载Installer,并在安装的过程中勾选「使用外部 OpenSSH」。如果你不幸通过scoop安装了,请卸载并改用官方的安装包(否则你会发现jj无法push)。
:
使用外部SSH时,若要设置Git的代理,应手动指定 connect.exe 的路径,如:
Proxycommand C:\Program Files\Git\mingw64\bin\connect.exe -S 127.0.0.1:7890 %h %p
Jujutsu可以通过scoop安装,直接 scoop install jj 就行了。
2. 配置majutsu
如果你用的emacs 30+ 的版本,可以用 use-package 的 :vc 关键字直接从Github Repo安装Majutsu。
(use-package majutsu
:vc (:url "https://github.com/0WD0/majutsu"
:rev :newest)
:bind
(("C-x j" . majutsu-log)
("C-x C-j" . majutsu-log)))
不然的话,也可以用其他方式,或者手动下载相关文件。
3. 使用majutsu
C-x j 进入majutsu界面。jujutsu的思路和git不一样,取消了暂存区等功能,当前文件的状态是一个未命名的新HEAD,commit之后就会固定。
一个简单的工作流程是:
在当前repo里进行一些变更,等觉得应该保存当前状态了,就 C-x j 然后 c ,输入commit内容,生成一个commit。
如果想上传了,就 C-x j 然后将光标移动至想更新到的commit上,再 b s ,将 main 移动过来,最后 G p p 推送。
更详细的介绍,请看下面两个教程:
下面我用几个实际案例说明一下操作。
3.1. 初始化
这一步需要在cmd/pwsh中进行。以下均假设默认branch为 main 。
如果需要从头clone一个repo:
jj git clone --colocate REPO-URL
如果本地已经有一个git的repo,则需要在初始化之后明确追踪 main@origin (根据实际情况的主要分支而定):
jj git init --colocate
jj bookmark track main@origin
3.2. 保存变更为commit
在当前repo里进行一些变更,等觉得应该保存当前状态了,就 C-x j 然后 c ,输入commit内容, C-c C-c 保存并生成一个commit。
3.3. 将本地commit上传
C-x j 进入Majutsu界面,然后将光标移动至想更新到的commit上,再 b s ,将 main 移动过来,最后 G p p 推送。
3.4. 拉取并merge远端
由于没有新branch,默认是采取的rebase方法。
C-x j 进入Majutsu界面,然后 G f f fetch远端,再 r 进入rebase界面,移动光标到本地commit,按 s 将其选为起点,再移动光标到fetch的远端commit,按 d 将其选为终点,最后按 r 确认rebase。
3.5. 放弃本地变更
有的时候需要放弃本地变更。只能放弃可变的变更(非菱形图标),将光标移动到该commit上,按 a 再按 y 就能放弃。