@tarsius是对的,目前没有内置命令可以完成这个操作。
不过,你可以这样做:
: ls-files
RET
:
绑定到magit-git-command
,允许你
异步执行Git子命令,并显示输出。 使用前缀参数在当前存储库的根目录中运行Git。[...]
当然,你也可以通过记录键盘宏或定义自定义命令并将其绑定到你选择的键序列来自动化上述过程:
(defun magit-ls-files ()
"List tracked files of current repository."
(interactive)
(if (derived-mode-p 'magit-mode)
(magit-git-command "ls-files" default-directory)
(message "Not in a Magit buffer.")))
(define-key magit-mode-map (kbd "K") 'magit-ls-files)
(add-hook 'magit-mode-hook (lambda () (define-key magit-mode-map (kbd "K") 'magit-ls-files)))
,以便在使用 magit-mode-map 之前定义 magit-mode-map。 - eludomlambda
来添加钩子功能有几个缺点。它使得钩子变量的值难以阅读,并且你不能轻松地通过 remove-hook
移除功能。因此,如果你想使用钩子,应该将你的 lambda
主体包装在一个 defun
中,并将其添加到钩子中。另一种解决方案是在修改模式映射之前简单地 (require 'magit)
,或者使用 eval-after-load
将代码包装在我的答案中。 - itsjeydM-x my-git-dired
并输入git工作目录(或子目录)。生成的缓冲区是一个普通的dired缓冲区,因此可以在多个文件上进行查询替换,例如。
(defun my-git-dired (dir)
(interactive
"DDirectory inside a git repository: \n")
(condition-case nil
(dired (cons "*git-dired*" (my-git-ls-files dir)))
(error (message "Execution of git-ls-files failed"))))
(defun my-git-ls-files (dir)
(save-excursion
(cd dir)
(split-string
;; The following is shell-command-to-string with error handling added.
(with-output-to-string
(with-current-buffer
standard-output
(unless (= 0 (call-process shell-file-name nil t nil
shell-command-switch "git ls-files"))
(error "Not a git repo")))))))
输出结果不够干净,但我一直在做的是从magit-status
缓冲区中按l f TAB。
Logging
,调用magit-key-mode-popup-logging
File log
的"f",调用magit-file-log
minibuffer-complete
您可以通过自定义键绑定和/或宏使此过程更加容易。
我只是使用M-& git ls-files -z | xargs -0 -- ls -ld
,然后跟着M-x dired-virtual RET
。后者需要加载dired-x
库。
magit-insert-tracked-files
的函数,可以使用j t
运行...然而,尽管代码似乎表明它会创建该部分,但这对我来说并没有实际创建该部分。相反,它会给出错误Section "Tracked files" wasn’t found
...我不确定为什么,也不知道如何修复它,所以只能将其作为注释留下。但是,大概率情况下,这(或与此相关的内容)将是完成此操作的方法... - lindes