Answers:
您可以在表格中使用: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_%
[RO]
在状态行中注意到)。
fugitive
需要从存储库根目录开始的路径。答案已经涵盖了这一点,但是我错误地认为逃犯可以理解我们何时在仓库的特定子目录中。
这比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
:file
来命名文件,而不是拥有一个临时文件。请参阅:h :file