【求助】 magit 中如何显示某一行的 log?

需求:

在浏览代码时,想追踪某一行(或几行)的历史,然后 magit-blame 只显示上一次修改时的 log。

目前方案:

用 magit log 的 -L option

缺点:

flow 不够流畅,需要从当前正在看的代码中脱离出去,还要手动输入 file 和 trace 范围。


自己写了个小 function,来简化流程: (defun my-magit-log-line () (interactive) (let* ((file (buffer-file-name (current-buffer))) (trace (magit-read-string “Trace”)) (optstr (concat "-L " trace “:” file))) (message optstr) (magit-log-current nil `(,optstr))))

现在流程变成: 在浏览文件时,M-x my-magit-log-line (当然也可以绑定到什么快捷键),然后输入 28,+5 这类(从28行开始的5行),就可以了。

改进思路:

  • 自动获取当前所选的行,然后就不用让用户输入了,flow 变成 select a region, 然后 M-x magit-log-line 即可
2 个赞

这个我也想知道。。

没有太懂楼主需求,不过如果我想追溯这段代码的修改历史的时候,我会用 git-timemachine 这个工具,进去之后按 p n 就可以在历史之间浏览了。

1 个赞

多谢推荐,git-timemachine 很好用

我的需求是想看针对某几行的历史变化,比如一个文件可能有 100 个 commits,但针对 line 20-25 可能只有三个,我就是想看到这三个。

对应的 git 命令是 git log -L

第一遍看帖子没看到这句,想着“输入28,+5干什么,按选中区域行号就好了嘛”

刚好前几天写过获取行号的代码,in case楼主还没改好:

(defun line-number-at-position (pos)
  "Returns the line number for position `POS'."
  (save-restriction
    (widen)
    (save-excursion
      (goto-char pos)
      (+ 1 (count-lines (point-min) (line-beginning-position 1))))))
1 个赞

可以从内置c的一个display number入手

1 个赞

在spacemacs中, SPC+g+M+s 是不是你要的

line-number-at-pos不能获取吗?

先选中一块区域,然后使用 C-x v h (vc-region-history) 就可以了

4 个赞

我记得 Magit 自带了快捷键:

  • 选中要查询的目标行
  • 按快捷键:C-c M-g l

最后一个按键是 lmn 中的 l

2 个赞