Comment ouvrir un fichier depuis une autre branche git?

35

J'aimerais ouvrir un fichier depuis une autre branche du référentiel git actuel. J'ai vu cette question SO , mais les suggestions pour la combiner avec Vim sont fastidieuses (pipe vers Vim, stdin ouvert, set type de fichier, etc. manuellement). Existe-t-il un moyen plus simple de conserver la coloration syntaxique, les paramètres de type de fichier, etc.?

Si cela aide:

  • J'ai le plugin fugitif installé (bien que rarement utilisé).
  • Je n'ai pas besoin de le modifier.

Le fichier peut être le fichier du tampon actuellement ouvert ou un fichier différent.

muru
la source

Réponses:

49

Vous pouvez utiliser :Gedit/ :Gsplit/ :Gvsplit/ ... avec le formulaire{revision}:{filename}

:Gedit branch:/foo/bar.c

Remarque: Si le fichier est identique au fichier actuel, vous pouvez abréger la commande de la manière suivante :Gsplit branch:%:.

Il arrive souvent qu'un fichier diff du fichier actuel soit préféré à la simple ouverture du fichier sur une autre branche. Vous pouvez le faire via :Gdiff {branch}.

Pour plus d'aide, voir:

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

Vous pouvez également consulter les épisodes de Vimcasts dans la série Fugitive .

Peter Rincker
la source
Beau! Curieux: que se passe-t-il si je modifie un fichier ainsi ouvert?
Muru
1
@muru Vous remarquerez que le tampon est ouvert dans un tampon en lecture seule (vous remarquerez probablement un [RO]dans la ligne d'état).
Peter Rincker
oui, c'est là.
Muru
fugitivea besoin du chemin depuis la racine du référentiel. La réponse couvre déjà cela, mais j'ai supposé à tort que le fugitif pouvait comprendre lorsque nous nous trouvions dans un sous-répertoire particulier du référentiel.
Paschalis
incroyable .. première fois en utilisant fugitive .. même si je l'avais installé depuis longtemps :)
alpha_989
14

C’est un peu plus large que ce que demande OP, mais pour les personnes qui ne souhaitent pas utiliser de plug-ins, voire d’autres systèmes de contrôle de révision, ce petit extrait a tendance à fonctionner assez bien:

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

Il crée une nouvelle fenêtre et affiche le fichier à cet endroit en lisant le résultat de la commande donnée dans le nouveau tampon. Ceci fonctionne bien sûr avec n'importe quelle commande externe, pas seulement git.

Exemple pour bzr (où la syntaxe REV peut spécifier une branche):

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

Exemple pour hg (pas sûr des branches en hg; ne l'utilisez pas assez)

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

Exemple pour svn (

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

Vous voudrez probablement toujours définir le type de fichier pour que la syntaxe soit surlignée comme dans les publications SO, mais au moins vous n’aurez pas à vous soucier de la tuyauterie.

Une fois ouvert, vous pouvez le sauvegarder sous un nouveau nom avec :w filenameou :saveas filenamepuisque Vim n'aura pas encore de nom de fichier. Si vous ne voulez pas pouvoir l'éditer, vous pouvez aussi ajouter un :setlocal readonlyet / ou :setlocal nomodifiable.

-Edit: Type de fichier automatique-

C'est un peu plus de travail, mais vous pouvez demander à Vim de deviner le type de fichier avec

:filetype detect

Mais, comme Vim n’a pas encore de nom, cela ne fonctionne pas toujours bien (par exemple, j’ai introduit du code C et j’ai deviné filtype=conf.

Nous pouvons lui donner un nom en l'enregistrant, mais nous ne voulons pas écraser un fichier éventuellement existant. Nous pouvons également simplement définir le nom de fichier (Merci @PeterRincker!), Mais encore une fois, nous ne voulons pas risquer des collisions. Comme il est peu probable qu'un fichier existe à la fois avec le nom de branche et le nom de fichier, nous les concaténerons avec un séparateur arbitraire.

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

"file"est remplacé par le nom de fichier actuel et "branch"par le nom de la branche

Bien sûr, nous sommes presque en train d’écrire un plugin ;-)

En résumé, voici une fonction spécifique à git que vous pouvez déposer dans votre 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 vous pouvez insérer dans une commande ou appeler directement, par exemple call GitFile("whateverBranch","myfile.c"). Vous obtiendrez une nouvelle fenêtre avec un tampon nomméwhateverBranch-myfile.c

John O'M.
la source
Et puis-je le faire détecter automatiquement le type de fichier, la syntaxe, etc. avec cette méthode?
Muru
Malheureusement, pas sans un peu plus de travail; J'ai mis à jour le post
John O'M.
1
Je vous recommande d'utiliser la méthode du plugin de l'article de @ PeterRinker si vous le pouvez. Il devrait faire beaucoup de belles choses que vous aimeriez. Je voulais surtout montrer qu'il n'était pas nécessaire de quitter l'éditeur ni de s'occuper des problèmes de piping pour obtenir les données, et je sais qu'il y a des gens qui détestent utiliser des plugins.
John O'M.
1
Je viens d'ajouter un peu pour pouvoir détecter le type de fichier. Ce n’est plus quelque chose que vous voudriez taper à la volée, mais qui pourrait facilement s’ajouter à un .vimrc. L'utilisation d'un plugin spécifique fonctionnera probablement encore mieux.
John O'M.
Vous voudrez peut-être envisager d'utiliser :filele nom de votre fichier au lieu d'un fichier temporaire. Voir:h :file
Peter Rincker