如何在 magit 中列出被跟踪的文件(git ls-files)?

8
你如何在Magit中列出已跟踪的文件(git ls-files)?

至少在Magit 2.11.0中存在一个名为magit-insert-tracked-files的函数,可以使用j t运行...然而,尽管代码似乎表明它会创建该部分,但这对我来说并没有实际创建该部分。相反,它会给出错误Section "Tracked files" wasn’t found...我不确定为什么,也不知道如何修复它,所以只能将其作为注释留下。但是,大概率情况下,这(或与此相关的内容)将是完成此操作的方法... - lindes
6个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
6

@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)

1
需要将 mode map 修改为钩子 (add-hook 'magit-mode-hook (lambda () (define-key magit-mode-map (kbd "K") 'magit-ls-files))),以便在使用 magit-mode-map 之前定义 magit-mode-map。 - eludom
1
@eludom 使用 lambda 来添加钩子功能有几个缺点。它使得钩子变量的值难以阅读,并且你不能轻松地通过 remove-hook 移除功能。因此,如果你想使用钩子,应该将你的 lambda 主体包装在一个 defun 中,并将其添加到钩子中。另一种解决方案是在修改模式映射之前简单地 (require 'magit),或者使用 eval-after-load 将代码包装在我的答案中。 - itsjeyd

4

为了跟进 @lindes 的评论,您可以进行配置以使Magit在状态缓冲区中包含已跟踪文件列表,方法如下:

(magit-add-section-hook
   'magit-status-sections-hook
   'magit-insert-tracked-files
   nil
   'append)
例如在您的.emacs文件中。 (有关此操作的详细信息,请参见状态部分部分钩子文档。) 然后,在Magit状态缓冲区中,键入Lindes提到的j t键序列将转到已跟踪文件部分。

2

Magit不具备这个功能,但是dired-k可以展示每个文件的(git)状态,这可能已经足够了。


0
以下代码片段对我非常有效。要使用它,请运行M-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")))))))

0

输出结果不够干净,但我一直在做的是从magit-status缓冲区中按l f TAB

  1. l:小写字母"L"代表Logging,调用magit-key-mode-popup-logging
  2. f:代表File log的"f",调用magit-file-log
  3. TAB:调用minibuffer-complete

您可以通过自定义键绑定和/或宏使此过程更加容易。


0

我只是使用M-& git ls-files -z | xargs -0 -- ls -ld,然后跟着M-x dired-virtual RET。后者需要加载dired-x


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,