使用emacs(和magit?)访问给定的commit / branch / etc中的文件

时间:2014-08-21 07:10:48

标签: git emacs magit

如果我想查看foo.bar在某个提交<COMMIT_ID>中的样子,那么我可以调用:

git show <COMMIT_ID>:foo.bar

很好......我怎样才能在emacs中这样做?使用magit?使用vc?说我正在访问文件foo.bar,我想查看它在<COMMIT_ID>中的显示方式。

4 个答案:

答案 0 :(得分:27)

在Emacs中执行此操作的规范方法是使用VC:来自文件缓冲区的C-x v ~将要求您进行修订,然后将该文件显示为该修订版本。它应该适用于VC支持的任何控制系统,例如Git,Bzr,......

答案 1 :(得分:21)

  • C-x v l 查看文件的历史记录。
  • n p 在提交之间移动。
  • f 从提交点开始访问该文件。

这已经绑定到log-view-find-revision,如果我们查看代码,我们会看到关键位是:

(switch-to-buffer (vc-find-revision file revision)))

所以我们可以将它包装在一个自定义函数中:

(defun my-vc-visit-file-revision (file revision)
  "Visit FILE as it was at REVISION."
  (interactive
   (list (expand-file-name
          (read-file-name (if (buffer-file-name)
                              (format "File (%s): " (file-name-nondirectory
                                                     (buffer-file-name)))
                            "File: ")))
         (read-string "Revision: ")))
  (require 'vc)
  (switch-to-buffer
   (vc-find-revision file revision)))

编辑:Stefan提供了一个更好的答案,但是如果您希望能够选择文件以及修订版本,这里是我的函数版本,它维护交互式文件选择,但使用来自{的代码{1}}用于修订处理。

我的结论是默认情况下使用other-window确实更有意义,所以我在这里也做了同样的事情 - 除非你提供了一个前缀参数,在这种情况下它会使用当前窗口。

vc-revision-other-window

答案 2 :(得分:8)

有一个名为git-timemachine的软件包,它使查看文件以前版本的过程几乎完全无缝;请参阅安装说明和演示的链接。 (如果您已经在使用MELPA,只需执行 M-x package-install RET git-timemachine RET )。

它的工作方式是,从访问跟踪文件的缓冲区中调用 M-x git-timemachine RET 。然后你可以:

  
      
  • p访问之前的历史版本
  •   
  • n访问下一个历史版本
  •   
  • w复制当前历史版本的缩写哈希值
  •   
  • W复制当前历史版本的完整哈希值
  •   
  • q退出时间机器。
  •   

请注意,如果您知道要访问的提交的哈希值,那么来自@ phils&#39;的自定义命令解决方案将为您的特定用例提供更好的服务。但是对于文件的不同版本之间的导航,我发现使用git-timemachine比使用VC提供的功能更容易。

您当然可以将git-timemachine绑定到您选择的键绑定。

答案 3 :(得分:7)

如果您正在查看magit中的提交,只需按文件或您感兴趣的文件的一部分即可输入。