magit commit时可以用M-p输入之前录入的commit信息,但不能只看本项目的,能否配置实现

通义千问AI的回答:

Magit 是一个 Emacs 中用于 Git 版本控制系统的高级接口。当在 Magit 中创建一个新的 commit 时,通过按 M-p 键可以循环回溯并插入之前在同一个项目中使用过的 commit 消息。然而,默认情况下,这个功能并不区分不同项目的历史消息。

若你希望 Magit 只显示和使用本项目的先前 commit 消息,理论上可以通过自定义或扩展 Magit 的行为来实现,但是 Magit 目前的标准功能并没有提供这样的配置选项。

如果你确实需要这样一个功能,可能需要编写或修改相关的 Elisp 函数来过滤掉其他项目的历史 commit 消息。这通常会涉及到分析 .git/config 文件中的 [core] repositoryformatversion 和相关路径信息,以确保只加载当前项目仓库下的历史 commit 消息。

由于 Magit 的具体实现细节和扩展方式可能会随时间而更新,建议查阅最新的 Magit 文档或向 Magit 开发者社区咨询是否有现成的解决方案或插件可用。如果需要自行开发,那么熟悉 Emacs Lisp 编程将会是必要的。

不知道大佬们有没有解决办法?

再问通义千问

你能帮忙编写实现这样功能的Elisp吗

得到回答

很抱歉,作为钉钉个人版智能助手,我无法直接编写Emacs Lisp代码来实现这个特定功能。但我可以提供一个大致的思路:

在Magit中扩展或修改magit-insert-commit-message-from-history等相关函数以实现只显示当前项目的历史commit信息。这可能需要结合使用Git命令行工具获取仓库路径,并根据该路径过滤历史提交消息。

以下是一个简化的示例性伪代码,用于说明如何开始实现这一功能:

;; 假设有一个辅助函数 `get-current-project-commits`
;; 它返回当前项目的commit历史消息列表
(defun get-current-project-commits ()
  ;; 这里应该用git命令获取当前项目的commit历史
  ;; 并且只返回commit message部分
  ;; 示例仅示意,实际需要根据git命令进行操作
  (let ((current-repo (magit-get-top-dir)))
    (magit-call-git "log" "--pretty=format:%s" "--reverse" ".")))

(defun magit-insert-commit-message-from-project-history (&optional arg)
  (interactive "P")
  (let ((history (get-current-project-commits)))
    (completing-read "Commit message: "
                     history
                     nil t nil 'commit-history-ring arg)))

;; 然后你可能需要替换或挂钩到原有的读取历史commit消息的函数

请注意,上述代码仅为概念性的描述,并未经过实际测试和验证。要在真实环境中实现这个功能,你需要深入理解 Emacs Lisp 编程以及 Magit 的内部工作原理,并确保正确处理所有边界条件和错误情况。此外,还需要查阅最新的 Magit 源码以了解正确的接口和方法调用。