Come faccio ad aprire un file da un altro ramo git?


35

Vorrei aprire un file da un altro ramo nell'attuale repository git. Ho visto questa domanda SO , ma i suggerimenti per combinarla con Vim sono ingombranti (pipe to Vim, open stdin, set filetype, ecc. Manualmente). Esiste un modo più semplice per mantenere l'evidenziazione della sintassi, le impostazioni del tipo di file, ecc.?

Se aiuta:

  • Ho installato il plugin fuggitivo (anche se usato raramente).
  • Non ho bisogno di modificarlo.

Il file può essere il file per il buffer attualmente aperto o diverso.

Risposte:


49

Puoi usare :Gedit/ :Gsplit/ :Gvsplit/ ... con il modulo{revision}:{filename}

:Gedit branch:/foo/bar.c

Nota: Se il file è lo stesso del file corrente è possibile abbreviare il comando in questo modo: :Gsplit branch:%.

Accade spesso che si preferisca una diff del file corrente rispetto alla semplice apertura del file su un ramo diverso. Puoi farlo tramite :Gdiff {branch}.

Per ulteriori informazioni, consultare:

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

Potresti anche voler controllare gli episodi di Vimcasts nella serie Fugitive .


Bellissimo! Curioso: cosa succede se modifico un file così aperto?
Muru,

1
@muru Noterai che il buffer è aperto in un buffer di sola lettura (probabilmente noterai un [RO]nella riga di stato).
Peter Rincker,

sì, è lì.
Muru,

fugitiverichiede il percorso dalla radice del repository. La risposta copre già questo, ma ho erroneamente supposto che il fuggitivo potesse capire quando ci troviamo in una particolare sottodirectory del repository.
Paschalis,

fantastico .. la prima volta che ho usato il fuggitivo .. anche se l'ho installato da molto tempo :)
alpha_989,

14

Questo è un po 'più ampio di quello che ha chiesto OP, ma per le persone che non vogliono usare plugin e forse altri sistemi di controllo di revisione, questo piccolo frammento tende a funzionare abbastanza bene:

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

Crea una nuova finestra e mostra il file lì leggendo l'output del comando dato nel nuovo buffer. Questo ovviamente funziona con qualsiasi comando esterno, non solo con git.

Esempio per bzr (dove la sintassi REV può specificare un ramo):

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

Esempio per hg (non sono sicuro dei rami in hg; non usarlo abbastanza)

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

Esempio per svn (

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

Probabilmente vorrai comunque impostare il tipo di file per ottenere l'evidenziazione della sintassi come nei post SO, ma almeno non devi fare confusione con il piping.

Una volta aperto, puoi salvarlo con un nuovo nome con :w filenameo :saveas filename, poiché Vim non avrà ancora un nome file per esso. Se non vuoi essere in grado di modificarlo, puoi anche inserire un :setlocal readonlye / o :setlocal nomodifiable.

-Edit: Tipo di file automatico-

È un po 'più di lavoro, ma puoi chiedere a Vim di indovinare il tipo di file

:filetype detect

Ma, dal momento che Vim non ha ancora un nome, non sempre funziona bene (ad esempio, ho inserito un codice C e ho indovinato filtype=conf.

Possiamo dargli un nome salvandolo, ma non vogliamo sovrascrivere un file eventualmente esistente. Possiamo anche solo impostare il nome del file (grazie @PeterRincker!), Ma ancora una volta, non vogliamo rischiare collisioni. Poiché è improbabile che esista un file che sia insieme il nome del ramo e il nome del file, li concateneremo con un separatore arbitrario

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

Dove "file"viene sostituito con il nome file effettivo e "branch"con il nome del ramo

Certo, a questo punto stiamo quasi scrivendo un plugin ;-)

Mettendo tutto insieme, qui è come una funzione specifica git che potresti inserire nel tuo 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

che potresti racchiudere in un comando o chiamare direttamente ad es call GitFile("whateverBranch","myfile.c"). Otterrai una nuova finestra con un buffer denominatowhateverBranch-myfile.c


E posso ottenerlo per rilevare automaticamente il tipo di file, la sintassi, ecc. Con questo metodo?
muru,

Purtroppo non senza altro lavoro; Ho aggiornato il post
John O'M.

1
Consiglio di usare il metodo plugin dal post di @ PeterRinker, se puoi. Dovrebbe fare molte delle cose carine che vorresti. Per lo più volevo dimostrare che non è necessario lasciare l'editor né gestire i problemi delle tubazioni per ottenere i dati, e so che ci sono persone che odiano dover usare i plugin.
John O'M.

1
Ho appena aggiunto un po 'per essere in grado di rilevare il tipo di file. Non è più qualcosa che vorresti semplicemente digitare al volo, ma potrebbe funzionare come una semplice aggiunta a un .vimrc. L'uso di un plug-in specifico probabilmente funzionerà ancora meglio.
John O'M.

Potresti voler esaminare come usare il :filenome del tuo file invece di avere un file temporaneo. Vedi:h :file
Peter Rincker,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.