別のgitブランチからファイルを開くにはどうすればよいですか?


35

現在のgitリポジトリの別のブランチからファイルを開きたいです。私はこのSOの質問を見てきましたが、Vimと組み合わせるための提案は面倒です(Vimにパイプする、stdinを開く、ファイルタイプを手動で設定するなど)。構文の強調表示、ファイルタイプの設定などを保持する簡単な方法はありますか?

役立つ場合:

  • 私が持っている逃亡者(ほとんど使用されませんが)プラグインがインストールされています。
  • 変更する必要はありません。

ファイルは、現在開いているバッファのファイルでも、別のバッファでもかまいません。

回答:


49

:Gedit/ :Gsplit/ :Gvsplit/ ...をフォームで使用できます{revision}:{filename}

:Gedit branch:/foo/bar.c

注:ファイルが現在のファイルと同じ場合、次のようにコマンドを短縮できます:Gsplit branch:%

多くの場合、現在のファイルの差分が、別のブランチでファイルを開くよりも優先されることがよくあります。これはを介して実行できます:Gdiff {branch}

詳細については、以下を参照してください。

:h fugitive-:Gedit
:h fugitive-revision
:h fugitive-:Gdiff
:h c_%

Fugitive SeriesのVimcastsエピソードもご覧ください。


綺麗な!好奇心:開いたファイルを変更するとどうなりますか?
ムル

1
@muruバッファが読み取り専用バッファで開かれていることに気付くでしょう(おそらく[RO]ステータス行にあることに気付くでしょう)。
ピーターリンカー

うん、そこにある。
ムル

fugitiveリポジトリのルートからのパスが必要です。答えはすでにこれをカバーしていますが、レポジトリの特定のサブディレクトリにいるときに逃亡者が理解できると誤って仮定しました。
パスカル

すごい..逃亡者を初めて使用した..長い間インストールしていたのに:)
alpha_989

14

これは、OPが要求したものよりも少し広範ですが、プラグインやその他のリビジョン管理システムを使用したくない人のために、この小さなスニペットはかなりうまく機能する傾向があります。

:new
:r! git show branch:file
:1d

新しいウィンドウを作成し、指定されたコマンドの出力を新しいバッファーに読み込むことにより、そこにファイルを表示します。もちろん、これはgitだけでなく、あらゆる外部コマンドで機能します。

bzrの例(REV構文はブランチを指定できます):

:new
:r! bzr cat -r REV file
:1d

hgの例(hgのブランチについてはわかりません。十分に使用しないでください)

:new
:r! hg cat -r REV file
:1d

svnの例(

:new
:r! svn cat file@REV
:1d

おそらく、SOの投稿のように構文の強調表示を取得するためにファイルタイプを設定したいでしょうが、少なくともパイピングを台無しにする必要はありません。

開いたら、:w filenameまたは:saveas filenameで新しい名前で保存できます。Vimにはまだファイル名がないためです。編集できないようにする場合は、:setlocal readonlyおよび/またはをスローすることもできます:setlocal nomodifiable

-編集:自動ファイルタイプ-

もう少し作業が必要ですが、Vimにファイルタイプを推測させることができます。

:filetype detect

しかし、Vimにはまだ名前がないため、これは必ずしもうまく機能しません(たとえば、Cコードをいくつか読み込んで推測しました)filtype=conf

保存することで名前を付けることはできますが、既存のファイルを上書きしたくありません。ファイル名を設定することもできます(@PeterRinckerに感謝します!)ブランチ名とファイル名の両方であるファイルが存在する可能性は低いため、任意のセパレータでそれらを連結します

:exe "silent file " . "branch" . "-" . "file"
:filetype detect

どこ"file"が実際のファイル名と"branch"ブランチ名に置き換えられます

もちろん、この時点でプラグインをほぼ作成しています;-)

それをすべてまとめると、vimrcにドロップできるgit固有の関数としてここにあります:

function! GitFile(branch,file)
    new
    exe "silent r! git show " . a:branch . ":" . a:file
    1d
    exe "silent file " . a:branch . "-" . a:file
    filetype detect
    setlocal readonly     "don't allow saving
    setlocal nomodified   "allow easy quitting without saving
    setlocal nomodifiable "don't allow modification
endfunction

これをコマンドでラップしたり、直接呼び出したりできますcall GitFile("whateverBranch","myfile.c")。という名前のバッファを持つ新しいウィンドウが表示されますwhateverBranch-myfile.c


また、この方法でファイルタイプ、構文などを自動的に検出できますか?
ムル

残念ながら、さらに作業が必要です。私はポスト更新
ジョンO'Mを。

1
可能であれば、@ PeterRinkerの投稿からプラグインメソッドを使用することをお勧めします。それはあなたが望む多くの素晴らしいことをするはずです。私は主に、エディターを離れたり、データを取得するための配管の手間をかけたりする必要がないことを示したかったのですが、プラグインの使用を嫌う人がいることは知っています。
ジョン・オム。

1
ファイルタイプを検出できるように少し追加しました。すぐに入力するだけではなく、.vimrcへの簡単な追加として機能します。特定のプラグインを使用することは、おそらくより良く機能します。
ジョン・オム。

:file一時ファイルを使用する代わりに、ファイルの名前の使用を検討することをお勧めします。参照:h :file
ピーターリンカー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.