foo.bar
特定のコミットでどのように見えるかを確認したい場合は<COMMIT_ID>
、次を呼び出すことができます。
git show <COMMIT_ID>:foo.bar
いいね...どうすればできますemacs
か?を使用していmagit
ますか?を使用していvc
ますか?ファイルにアクセスしていて、ファイルfoo.bar
がどのように見えたかを調べたいとします<COMMIT_ID>
。
Emacs でこれを行う標準的な方法は、VC を使用するC-x v ~
ことです。ファイルのバッファーからリビジョンを要求し、そのリビジョンでのファイルを表示します。Git、Bzrなど、VCでサポートされているすべての制御システムで機能するはずです...
これは にバインドさ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
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
、選択したキー バインドにバインドすることもできます。
magit でコミットを表示している場合は、関心のあるファイルまたはファイルの一部で Enter キーを押すだけです。