如何从另一个git分支打开文件?


35

我想从当前git存储库中的另一个分支打开文件。我已经看到了这样的问题,但是将其与Vim结合使用的建议非常繁琐(通过管道传递到Vim,打开stdin,手动设置文件类型等)。有没有更简单的方法来保留语法突出显示,文件类型设置等?

如果有帮助:

  • 我安装了逃犯插件(尽管很少使用)。
  • 我不需要修改它。

该文件可以是当前打开的缓冲区的文件,也可以是其他文件。

Answers:


49

您可以在表格中使用:Gedit/ :Gsplit/ :Gvsplit/ ...{revision}:{filename}

:Gedit branch:/foo/bar.c

注意:如果文件与当前文件相同,则可以将命令缩写为::Gsplit branch:%

通常情况下,与仅在不同分支上打开文件相比,首选使用当前文件的diff。您可以通过进行操作:Gdiff {branch}

有关更多帮助,请参见:

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

您可能还想查看《逃亡系列》中的Vimcasts剧集。


美丽!好奇:如果我修改打开的文件会怎样?
muru

1
@muru您会注意到该缓冲区在只读缓冲区中打开(可能[RO]在状态行中注意到)。
彼得·林克

是的,它在那里。
muru

fugitive需要从存储库根目录开始的路径。答案已经涵盖了这一点,但是我错误地认为逃犯可以理解我们何时在仓库的特定子目录中。
Paschalis

令人惊讶..第一次使用逃犯..即使我已经安装了很长时间:)
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"分支名称替换where

当然,在这一点上,我们几乎要编写一个插件;-)

一起修改,这里是一个特定于git的函数,您可以在vimrc中放入它:

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


我可以用这种方法自动检测文件类型,语法等吗?
muru

可惜的是,如果没有更多的工作,我更新了帖子
John O'M。

1
如果可以的话,我建议您使用@PeterRinker帖子中的plugin方法。它应该做很多您想要的好事。我主要想表明一个人不必离开编辑器也不必处理获取数据的管道麻烦,而且我知道有些人讨厌不得不使用插件。
John O'M。

1
我只是添加了一些能够检测文件类型。您不再需要即时输入内容,而是可以轻松添加.vimrc。使用特定的插件可能仍会更好。
John O'M。

您可能要考虑使用:file来命名文件,而不是拥有一个临时文件。请参阅:h :file
Peter Rincker
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.