EAF Git Client [Emacs高性能 Git 客户端]

Submodule列表齐活了,Git Client 是一个大工程呀,每天下班以后没事慢慢写,这玩意不能着急。

明天写一下 Stage/Unstage 的状态。

5 个赞

因为用pygit2这个库和python多线程,性能要比magit快太多了。

慢慢写,功能完善以后会是emacs里面最快的git客户端

4 个赞

我对git也不太熟悉,但是magit 使用来还是感觉很简单的,习惯的命令使用时间长了就成肌肉记忆了。如果一个按键简化功能, 那可能会使得git本身提供的多种功能被忽略了? 速度方面,目前magit 用起来也还算可以,当然我代码库都非常简单。

所以我觉得magit 重不重 我不是很关心(但感觉不是很重,主体都是Elisp, 安装就和其他包没啥区别),在使用方面不复杂,感觉很简单,还帮助我学习了很多git相关的知识。所以我个人,会更倾向于使用比较舒适的magit上。

先做出来用一下,当然两个项目的目标不太一样,EAF Git Client目标是场景化直觉化。

magit的目标是全面覆盖。

我个人对全面覆盖不感兴趣,我就想减轻记忆负担,一些场景化的操作不应该用一系列按键菜单组合来实现,真的记不住。:joy:

1 个赞

Stage 和 Unstage 信息搞定了,pygit2 内置的 repo file status API不能直接用,要针对 file status 做两种状态掩码遍历,因为有的文件同时包括 stage hunk 和 unstage hunk.

2 个赞

我最常用的一些操作:

  • 查看提交历史。
  • diff 两个提交或文件。
  • stage 暂存修改。常用 git add -i 进行部分选择(这个操作其实还是鼠标更顺手)。
  • amend 追加修改。
  • rebase 修饰近期的提交。
  • patch 生成和应用。
  • 分支操作,包括远程分支以及 github 的 pull request (不过这样冷门的操作要看小抄)。

我至今都不太会用 magit。原因大概是:

  1. magit 之前我已经用了很长时间的命令行,积习难改。对每个菜单项与命令的联系也不是十分肯定,担心踩雷。

  2. magit 太复杂了,记不住那么多快捷键,每次都按 ? 也很烦。为此我还特地写了一个叫 stubborn-hydra 的包,来辅助:

    当我按下 C-c g 之后,最主要的任务首先是查看修改,挑选合适的内容进行 stage,然后才是其他操作。

    这个虽然目前还很 buggy 的扩展大大缓解了我的焦虑,它可以设成在特定 buffer 常驻(C-g都杀不死,所以起名「顽固的九头蛇」),而在其他 buffer 自动消失。我把它用在 debug/dired/magit… 这些我记不住(也不想记)快捷键的地方。

1 个赞

QwQ终于有大佬愿意救救孩子,每次用magit想pull个仓库查个历史都得纠结半天按哪个怎么按,整个一大谜语人,关键又不太常用,然后就(被)远离了git世界 :joy:……

最希望能把每个状态下可以做的大操作都写个提示在下面,hydra配magit实在太丑了……

如果有需要帮忙可以随时叫我ww

比如我经常在EAF下载目录下开发代码,方便测试,但是我不能直接在用户目录下修改,避免无法干净测试用户更新后的效果(切换分支也容易弄错),所以我会在 HOME 目录下弄一个镜像仓库专门用于推送代码。原来最痛苦的是,目录树特别复杂的时候,我需要做这几个操作:

  1. 用 magit 列出所有变动的文件
  2. 记住变动的文件,把文件管理器分屏,然后在两个目录里面反复切换目录,一个一个的拷贝文件
  3. 拷贝文件以后还要确认目标目录是否所有文件都列出来了

如果有时候写代码写嗨了,文件改动特别多,上面这个步骤就很繁琐。

今天基于pygit2 API开发了一个高级功能,只用按一个按键, EAF Git Client 自动会把所有文件拷贝到目标镜像目录,然后切换到镜像目录直接提交代码就可以了。再也不用一个文件一个文件的拷贝了。

对,我就是想把初级Git用户的痛点都覆盖到,切换到每个界面,有直观友好的界面和一键式操作和帮助,不用在magit的各种组合菜单中跳来跳去,不好记又头晕。

1 个赞

感谢提供案例分享,我后续融入到我的设计中。

我现在在EAF Git Client的设计是,针对每个高频的操作都设定一个专注的操作界面,用户切换到这个界面,看一下下面的提示,马上就知道怎么操作了。

magit的设计是多个界面组合形成一个复杂操作,我觉得magit最大的缺点还不是记不住,就像你说的,每个菜单扭转的很多,用户的心智是希望确定某个操作就一定干什么活,而不是菜单间排列组合去猜结果,万一猜错了或者理解错了,代码可能就丢了。

这样交流后我就更坚定开发 EAF Git Client了,去掉按键记忆和组合结果的不确定性。

说实话,我不理解为什么magit会有用户存在记不住的现象,毕竟它可以通过M-x来完成所有功能。 另外,我觉得初级用户想用好git,只能去看看pro git或者读git manual…不然能用svn/hg就最好别用git…

magit的痛点在我这里是性能(还有部分的向前兼容),不过一直无从下手去profile

6 个赞

作为一个记性不好的人,我连 debug 都要看一下小抄。

magit 提供菜单界面,让用户以此组合出所需的操作。对于习惯了 git 命令行人,了解每个菜单以及组合产生的作用,是个不小的额外负担,学习的意愿也就有所消减。通过 magit 来操作 git,就像是看翻译的书籍,难免存在理解上的偏差。

「记不住」于我而言是常态,在日常编辑文本的时候,按错键不会造成太大的问题,但是在 magit 可能就是灾难性的。一些 minor mode 也会修改按键绑定,这进一步加剧了不确定性

我用 magit 主要就是用来 stage(不管是 TUI 还是 GUI,都比 git add -i 来的方便一些,可以直接 stage 选中的部分,不必频繁进/出 git editor)。所以我目前的做法就是把「多余」的 magit 按键隔离起来。这个「隔离层」按键绑定是 100% 确定、不会被覆盖的,它只包含光标移动和 stage 操作相关的键,以及保留一个 ? 通往真正的 magit:

   user            isolation layer          magit
     |                    |                   |
     | move cursor        |                   |
     | select/unselect    |                   |
     | stage/unstage      |                   |
     | toggle sections    |                   |
     |------------------->|------------------>|
     |                    |<------------------|
     |                    |                   |
     | ?                  |                   |
     |--------------------)------------------>|
     |                    |                   |
     | other keys         |                   |
     |------------------->|🚫                 |
     |                    |                   |
     |                    |                   |
     |                    |                   |
     v                    v                   v
5 个赞

我觉得 Emacs 自带的 VC 特别好用,特别是查看 log 的速度很快,而且 diff 时有高亮。就是无法做到方便地提交。

2 个赞

不是有 libegit2 的动态模块嘛,之前大仓库是感觉慢,用动态模块好多了。按键记不住,怕按错,难道要纯鼠标操作嘛?

M-x真的是咱emacser的救命神器哈哈 :rofl:

不过我总有一种隐隐的遗憾,作为一款伟大的软件,git本该傲立于世界人民的面前,而非被局限于这一隅。它的功能用在备份上、用在写作上、用在审阅上、用在共享上,都能让其它软件黯然失色。

这个世界是相互平行的,和我擦身而过的路人,可能生活在与我迥然不同的两个世界,被一层可悲的厚障壁相隔。而我与git可能也是如此。

我不想这样。我也愿意尽我一份绵薄之力去改变它。这是我作为一个文科生的想法。

1 个赞

隔行如隔山.

1 个赞

不用 EAF,这里列一下我平常觉得用 magit 会比较方便的功能:

  1. magit 的 log 上可以执行各种操作,然后当前光标所在行的 hash 会直接应用到接下来要用的命令上。
  2. 上面也提过的 rebase,比较简单的像 fixup 一类的 magit 非常直观,会弹 log buff,信息充足,不用反复切换。但如果需要 edit 来对历史修改的情况,在命令行要反复重复实在麻烦。magit 这种快捷键会比较舒服。
  3. 还是 rebase,用 onto 时,magit 要比命令行方便不止一点,命令行里得反复查 commit hash。
  4. 查看某一文件的历史信息,git log <file>(通过 magit 可以直接看当前文件的),进一步有选中时去执行 magit-log-buffer-file 可以看选中这一块的历史。不需要去手动指定行数。
  5. merge 冲突以及 apply 时可以直接用 ediff / smerge 来完成,非常方便。命令行也有交互的方式,不过感觉不如 ediff 来得直观。
  6. stage 时,可以直接选择 diff。
  7. git log -S 等可以直接查看对应的 diff,命令行里得多传参数或是二次操作。
  8. 接上一条,有时需要查找到把旧的 patch 再应用回来。而命令行我需要先查找(可能还得再查一遍 diff),然后记住 hash,然后再选我要用的 hunks。

大部分便利都在 commit 的选取上,虽然 shell 里有各种补全,但和 magit 里相对提供的信息还是相对较少。另外就是 diff 可以用 ediff 配合。快捷键简化 rebase 那种需要反复重复的工作,而且又因为可视信息较全,要比 cli 下得反复去确认操作来得快。

magit 有个问题是有些命令我找不到对应的功能,比如 checkout -p

加了Log Commit的上下操作, C-m 查看Commit对应的Diff, 先弄成 diff-mode, 以后有时间,可以默认把 diff 显示成双列比较方便。

其他功能慢慢加,开发 Git Client 当重新学习一遍 Git 各种命令。

感谢楼上的案例分享,等基本功能开发完以后再看怎么吸收大家平常的使用场景。

blame 可以看一下我的 GitHub - redguardtoo/vc-msg: Show commit message of current line in Emacs , 可以显示谁修改了选中的代码, 而不是当前一行谁最后碰过的. 仿git-messenger UI,但也和magit无缝整合.

好的,谢谢你的分享