Wie öffne ich eine Datei aus einem anderen Git-Zweig?


35

Ich möchte eine Datei aus einem anderen Zweig im aktuellen Git-Repository öffnen. Ich habe diese SO-Frage gesehen , aber die Vorschläge für die Kombination mit Vim sind umständlich (Pipe zu Vim, open stdin, set filetype, etc. manuell). Gibt es eine einfachere Methode, um Syntaxhervorhebungen, Dateitypeinstellungen usw. beizubehalten?

Wenn es hilft:

  • Ich habe das flüchtige Plugin installiert (obwohl es nur selten verwendet wird).
  • Ich muss es nicht ändern.

Die Datei kann die Datei für den aktuell geöffneten oder einen anderen Puffer sein.

Antworten:


49

Sie können :Gedit/ :Gsplit/ :Gvsplit/ ... mit dem Formular verwenden{revision}:{filename}

:Gedit branch:/foo/bar.c

Hinweis: Wenn die Datei die gleiche wie die aktuelle Datei , die Sie wie so den Befehl abkürzen können: :Gsplit branch:%.

Es ist oft der Fall, dass ein Diff der aktuellen Datei vorgezogen wird, als nur die Datei in einem anderen Zweig zu öffnen. Sie können dies über tun :Gdiff {branch}.

Weitere Hilfe finden Sie unter:

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

Möglicherweise möchten Sie auch Vimcasts- Episoden in der Fugitive-Serie ansehen .


Schön! Neugierig: Was passiert, wenn ich eine so geöffnete Datei ändere?
muru

1
@muru Sie werden feststellen, dass der Puffer in einem Nur-Lese-Puffer geöffnet ist (wahrscheinlich [RO]in der Statuszeile).
Peter Rincker

Ja, es ist da.
muru

fugitivebenötigt den Pfad vom Stammverzeichnis des Repositorys. Die Antwort deckt dies bereits ab, aber ich habe fälschlicherweise angenommen, dass der Flüchtling verstehen könnte, wenn wir uns in einem bestimmten Unterverzeichnis des Repos befinden.
Paschalis

erstaunlich .. zum ersten Mal mit flüchtigen .. obwohl ich es für eine lange Zeit installiert hatte :)
alpha_989

14

Dies ist ein wenig weiter gefasst als von OP gefordert, aber für Leute, die keine Plugins und möglicherweise andere Revisionskontrollsysteme verwenden möchten, funktioniert dieses kleine Snippet in der Regel recht gut:

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

Es wird ein neues Fenster erstellt und die Datei dort angezeigt, indem die Ausgabe des angegebenen Befehls in den neuen Puffer eingelesen wird. Dies funktioniert natürlich mit jedem externen Befehl, nicht nur mit git.

Beispiel für bzr (wobei die REV-Syntax einen Zweig angeben kann):

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

Beispiel für hg (nicht sicher über Zweige in hg; verwenden Sie es nicht genug)

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

Beispiel für svn (

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

Sie möchten wahrscheinlich immer noch den Dateityp so einstellen, dass die Syntax hervorgehoben wird, wie in den SO-Posts, aber Sie müssen sich zumindest nicht mit Piping herumschlagen.

Einmal geöffnet können Sie es unter einem neuen Namen mit :w filenameoder speichern :saveas filename, da Vim noch keinen Dateinamen dafür hat. Wenn Sie es nicht bearbeiten können möchten, können Sie auch ein :setlocal readonlyund / oder einwerfen :setlocal nomodifiable.

-Bearbeiten: Automatischer Dateityp-

Es ist etwas mehr Arbeit, aber Sie können Vim bitten, den Dateityp mit zu erraten

:filetype detect

Aber da Vim noch keinen Namen hat, funktioniert dies nicht immer gut (zum Beispiel habe ich einen C-Code eingegeben und es wurde vermutet filtype=conf.

Wir können ihm einen Namen geben, indem wir ihn speichern, aber wir möchten eine möglicherweise vorhandene Datei nicht überschreiben. Wir können auch nur den Dateinamen festlegen (Danke @PeterRincker!), Aber wir möchten auch hier keine Kollisionen riskieren. Da es unwahrscheinlich ist, dass eine Datei existiert, die sowohl den Zweignamen als auch den Dateinamen enthält, verknüpfen wir sie mit einem beliebigen Trennzeichen

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

Wo "file"wird durch den tatsächlichen Dateinamen und "branch"durch den Zweignamen ersetzt

Natürlich schreiben wir an dieser Stelle fast ein Plugin ;-)

Wenn Sie alles zusammenfassen, ist dies eine git-spezifische Funktion, die Sie in Ihrem vimrc ablegen können:

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

die Sie in einen Befehl einwickeln oder direkt aufrufen können, z call GitFile("whateverBranch","myfile.c"). Sie erhalten ein neues Fenster mit einem Puffer namenswhateverBranch-myfile.c


Und kann ich mit dieser Methode Dateityp, Syntax usw. automatisch erkennen lassen?
muru

Leider nicht ohne etwas mehr Arbeit; Ich habe den Beitrag aktualisiert
John O'M.

1
Ich empfehle die Verwendung der Plugin-Methode aus @ PeterRinkers Beitrag, wenn Sie können. Es sollte viele der schönen Dinge tun, die Sie möchten. Ich wollte vor allem zeigen, dass man den Editor nicht verlassen und sich nicht um die lästigen Pipelines kümmern muss, um an die Daten zu kommen, und ich weiß, dass es einige Leute gibt, die es hassen, Plugins zu verwenden.
John O'M.

1
Ich habe gerade ein bisschen hinzugefügt, um den Dateityp erkennen zu können. Es ist nicht länger etwas, das Sie einfach im laufenden Betrieb eingeben möchten, sondern kann als einfache Ergänzung zu einer .vimrc-Datei verwendet werden. Die Verwendung eines bestimmten Plugins funktioniert wahrscheinlich immer noch besser.
John O'M.

Möglicherweise möchten Sie die Verwendung :filedes Namens Ihrer Datei untersuchen, anstatt eine temporäre Datei zu haben. Siehe:h :file
Peter Rincker
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.