29

foo.bar特定のコミットでどのように見えるかを確認したい場合は<COMMIT_ID>、次を呼び出すことができます。

git show <COMMIT_ID>:foo.bar

いいね...どうすればできますemacsか?を使用していmagitますか?を使用していvcますか?ファイルにアクセスしていて、ファイルfoo.barがどのように見えたかを調べたいとします<COMMIT_ID>

4

4 に答える 4

31

Emacs でこれを行う標準的な方法は、VC を使用するC-x v ~ことです。ファイルのバッファーからリビジョンを要求し、そのリビジョンでのファイルを表示します。Git、Bzrなど、VCでサポートされているすべての制御システムで機能するはずです...

于 2014-08-21T18:43:52.217 に答える
24
  • C-xvlファイルの履歴を表示します。
  • npコミット間を移動します。
  • 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はより良い答えを提供しましたが、リビジョンだけでなくファイルも選択できるのが好きなら、インタラクティブなファイル選択を維持する私の関数のバージョンがありますがvc-revision-other-window、リビジョン処理のためにコードを使用します。

デフォルトで other-window を使用する方が実際にはより理にかなっていると結論付けたので、ここで同じことを行いました-ただし、現在のウィンドウを使用する前置引数を指定しない限り。

(defun my-vc-visit-file-revision (file rev)
  "Visit revision REV of FILE in another window.
With prefix argument, uses the current window instead.
If the current file is named `F', the revision is named `F.~REV~'.
If `F.~REV~' already exists, use it instead of checking it out again."
  ;; based on `vc-revision-other-window'.
  (interactive
   (let ((file (expand-file-name
                (read-file-name
                 (if (buffer-file-name)
                     (format "File (%s): " (file-name-nondirectory
                                            (buffer-file-name)))
                   "File: ")))))
     (require 'vc)
     (list file (if (vc-backend file)
                    (vc-read-revision
                     "Revision to visit (default is working revision): "
                     (list file))
                  (vc-read-revision "Revision to visit: " t
                                    (or (vc-deduce-backend)
                                        (vc-responsible-backend file)))))))
  (require 'vc)
  (let ((revision (if (string-equal rev "")
                      (if (vc-backend file)
                          (vc-working-revision file)
                        (error "No revision specified for unregistered file %s"
                               file))
                    rev))
        (backend (or (vc-backend file)
                     (vc-deduce-backend)
                     (vc-responsible-backend file)))
        (visit (if current-prefix-arg
                   'switch-to-buffer
                 'switch-to-buffer-other-window)))
    (condition-case err
        (funcall visit (vc-find-revision file revision backend))
      ;; The errors which can result when we request an invalid combination of
      ;; file and revision tend to be opaque side-effects of some unexpected
      ;; failure within the backend; so we simply trap everything and signal a
      ;; replacement error indicting the assumed cause.
      (error (error "File not found at revision %s: %s" revision file)))))

このコマンドをにバインドしますC-xvC-f

于 2014-08-21T07:44:45.383 に答える
8

git-timemachine以前のバージョンのファイルを表示するプロセスをほぼ完全にシームレスにするというパッケージがあります。インストール手順とデモのリンクを参照してください。(すでに MELPA を使用している場合は、そのまま実行してくださいM-x package-install RET git-timemachine RET)。

M-x git-timemachine RETそれが機能する方法は、追跡されたファイルを訪問するバッファから呼び出すことです。次に、次のことができます。

  • p以前の履歴バージョンにアクセスする
  • n次の履歴バージョンにアクセス
  • w現在の履歴バージョンの省略されたハッシュをコピーします
  • W現在の履歴バージョンの完全なハッシュをコピーします
  • qタイムマシンを終了します。

アクセスしたいコミットのハッシュがわかっている場合は、@phils のソリューションのカスタム コマンドがその特定のユース ケースにより適していることに注意してください。しかし、ファイルの異なるバージョン間を移動git-timemachineする場合、VC が提供する機能を使用するよりも使用する方が簡単であることがわかりました。

もちろんgit-timemachine、選択したキー バインドにバインドすることもできます。

于 2014-08-21T10:05:45.707 に答える
7

magit でコミットを表示している場合は、関心のあるファイルまたはファイルの一部で Enter キーを押すだけです。

于 2015-09-25T13:59:27.020 に答える