Como faço para abrir um arquivo de outra ramificação git?

35

Eu gostaria de abrir um arquivo de outra ramificação no repositório git atual. Eu já vi essa pergunta SO , mas as sugestões para combiná-la com o Vim são complicadas (canal para o Vim, stdin aberto, conjunto de tipo de arquivo etc. manualmente). Existe uma maneira mais simples de reter o realce da sintaxe, as configurações de tipo de arquivo etc.?

Se ajudar:

  • Eu tenho o plugin fugitivo instalado (embora raramente usado).
  • Não preciso modificá-lo.

O arquivo pode ser o arquivo para o buffer aberto no momento ou outro.

muru
fonte

Respostas:

49

Você pode usar :Gedit/ :Gsplit/ :Gvsplit/ ... com o formulário{revision}:{filename}

:Gedit branch:/foo/bar.c

Nota: Se o arquivo é o mesmo que o arquivo atual, você pode abreviar o comando assim: :Gsplit branch:%.

Geralmente, é preferível um diff do arquivo atual do que apenas abrir o arquivo em uma ramificação diferente. Você pode fazer isso via :Gdiff {branch}.

Para obter mais ajuda, consulte:

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

Você também pode conferir os episódios do Vimcasts na Série Fugitive .

Peter Rincker
fonte
Lindo! Curioso: o que acontece se eu modificar um arquivo tão aberto?
Muru
11
@ muru Você notará que o buffer é aberto em um buffer somente leitura (provavelmente notará um [RO]na linha de status).
Peter Rincker
sim, está lá.
Muru
fugitiveprecisa do caminho da raiz do repositório. A resposta já cobre isso, mas assumi erradamente que o fugitivo poderia entender quando estamos em um subdiretório específico do repositório.
Paschalis
incrível .. primeira vez usando fugitivo .. apesar de tê-lo instalado por um longo tempo :) #
alpha_989 #
14

Isso é um pouco mais amplo do que o OP pediu, mas para as pessoas que não desejam usar plug-ins e possivelmente outros sistemas de controle de revisão, esse pequeno trecho tende a funcionar razoavelmente bem:

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

Ele cria uma nova janela e mostra o arquivo lá, lendo a saída do comando fornecido no novo buffer. Obviamente, isso funciona com qualquer comando externo, não apenas com o git.

Exemplo para bzr (onde a sintaxe REV pode especificar uma ramificação):

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

Exemplo para hg (não tenho certeza sobre ramificações em hg; não use o suficiente)

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

Exemplo para svn (

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

Você provavelmente ainda deseja definir o tipo de arquivo para obter destaque de sintaxe, como nas postagens de SO, mas pelo menos não precisa mexer na tubulação.

Depois de aberto, você pode salvá-lo com um novo nome com :w filenameou :saveas filename, pois o Vim ainda não terá um nome de arquivo para ele. Se você não quiser editá-lo, também pode inserir um :setlocal readonlye / ou :setlocal nomodifiable.

-Editar: Tipo de arquivo automático-

É um pouco mais trabalhoso, mas você pode pedir ao Vim para adivinhar o tipo de arquivo com

:filetype detect

Mas, como o Vim ainda não tem um nome, isso nem sempre funciona bem (por exemplo, eu inseri um código C e ele adivinhou filtype=conf.

Podemos dar um nome a ele salvando-o, mas não queremos sobrescrever um arquivo possivelmente existente. Também podemos definir o nome do arquivo (Obrigado @ PeterRincker!), Mas, novamente, não queremos arriscar colisões. Como é improvável que exista um arquivo com o nome da filial e o nome do arquivo juntos, concatená-los-emos com um separador arbitrário

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

Onde "file"é substituído pelo nome do arquivo real e "branch"pelo nome da ramificação

Claro, neste momento estamos quase escrevendo um plugin ;-)

Jogando tudo junto, aqui está como uma função específica do git que você pode colocar no seu 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

que você pode agrupar em um comando ou ligar diretamente, por exemplo call GitFile("whateverBranch","myfile.c"). Você receberá uma nova janela com um buffer chamadowhateverBranch-myfile.c

John O'M.
fonte
E posso detectá-lo automaticamente, com este método?
Muru
Infelizmente não sem mais trabalho; Eu atualizei o post
John O'M.
11
Eu recomendo usar o método de plug-in da postagem do @ PeterRinker, se puder. Deve fazer muitas das coisas legais que você gostaria. Eu queria mostrar principalmente que não é preciso sair do editor nem lidar com os aborrecimentos da canalização para obter os dados, e eu sei que existem algumas pessoas que odeiam ter que usar plug-ins.
John O'M.
11
Acabei de adicionar um pouco para poder detectar o tipo de arquivo. Não é mais algo que você gostaria de digitar on-the-fly, mas poderia funcionar como uma adição fácil a um .vimrc. O uso de um plugin específico provavelmente ainda funcionará melhor.
John O'M.
Você pode querer usar o :filenome do seu arquivo em vez de ter um arquivo temporário. Veja:h :file
Peter Rincker