1100 Stimmen

Wie kann eine einzelne Datei aus einer bestimmten Revision in Git abgerufen werden?

Ich habe ein Git-Repository und würde gerne sehen, wie einige Dateien vor einigen Monaten aussahen. Ich habe die Revision zu diesem Datum gefunden; sie lautet 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 . Ich muss sehen, wie eine Datei aussieht, und sie auch als ("neue") Datei speichern.

Ich konnte die Datei mit gitk aber es gibt keine Möglichkeit, sie zu speichern. Ich habe es mit den Befehlszeilen-Tools versucht, das Naheliegendste, was ich bekam, war:

git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt

Dieser Befehl zeigt jedoch einen Vergleich und nicht den Inhalt der Datei an. Ich weiß, dass ich später etwas verwenden kann wie PAGER=cat und die Ausgabe in eine Datei umleiten, aber ich weiß nicht, wie ich an den eigentlichen Dateiinhalt komme.

Im Grunde suche ich etwas wie svn-Kat .

111 Stimmen

Der Schlüssel dazu: git show verwendet (wenig hilfreich) eine andere Syntax mit einem Doppelpunkt. git show 2c7cf:my_file.txt

5 Stimmen

Zur weiteren Verdeutlichung: Mit dem obigen Befehl wird git aufgefordert, zwei separate Objekte anzuzeigen, eine Revision und eine Datei. Die akzeptierte Antwort unten, die einen Doppelpunkt zwischen den beiden Objekten verwendet, fragt nach einer bestimmten Datei in einer bestimmten Revision.

2 Stimmen

Unter *nix brauchen Sie kein PAGER, sondern nur eine Umleitung der Shell-Ausgabe mit >

1044voto

VonC Punkte 1117238

Verwendung von git show

Um Ihre eigene Antwort zu vervollständigen, lautet die Syntax in der Tat

git show object
git show $REV:$FILE
git show somebranch:from/the/root/myfile.txt
git show HEAD^^^:test/test.py

Der Befehl nimmt die übliche Art der Überarbeitung an, d.h. Sie können eine der folgenden Möglichkeiten verwenden:

  1. Name der Niederlassung (als vorgeschlagen por Asche )
  2. HEAD + x Anzahl von ^ Zeichen
  3. Der SHA1-Hash einer bestimmten Revision
  4. Die ersten paar (vielleicht 5) Zeichen eines gegebenen SHA1-Hashes

Tipp Es ist wichtig, daran zu denken, dass bei der Verwendung von " git show ", immer einen Pfad vom Stamm des Repositorys angeben und nicht Ihre aktuelle Verzeichnisposition.

(Obwohl Mike Morearty erwähnt, dass Sie zumindest mit git 1.7.5.4 einen relativen Pfad angeben können, indem Sie " ./ " am Anfang des Pfades. Zum Beispiel:

git show HEAD^^:./test.py

)

Verwendung von git restore

Mit Git 2.23+ (August 2019) können Sie auch git restore die ersetzt das Verwirrende git checkout commande

git restore -s <SHA1>     -- afile
git restore -s somebranch -- afile

Das würde im Arbeitsbaum nur die Datei wiederherstellen, wie sie in der "Quelle" ( -s ) SHA1 übertragen oder verzweigen somebranch .
Um auch den Index wiederherzustellen:

git restore -s <SHA1> -SW -- afile

( -SW : kurz für --staged --worktree )


Wie bereits in die Kommentare por starwarswii

Damit können Sie den Inhalt in eine Datei puffern, was besonders praktisch ist, wenn Sie Dateien aus einer Übertragung schnell vergleichen wollen.

Z.B. können Sie tun:

git show 1234:path/to/file.txt > new.txt 
git show 1234~:path/to/file.txt > old.txt

und vergleichen sie dann.


Git-Befehle auf niedriger Ebene verwenden

Vor git1.5.x wurde dies mit Hilfe von Klempnerarbeiten erledigt:

git ls-tree <rev>
eine Liste von einem oder mehreren 'Blob'-Objekten innerhalb einer Übertragung anzeigen

git cat-file blob <file-SHA1>
cat eine Datei, wie sie innerhalb einer bestimmten Revision übertragen wurde (ähnlich wie svn cat). verwenden git ls-tree um den Wert einer bestimmten Datei-sha1 abzurufen

git cat-file -p $(git-ls-tree $REV $file | cut -d " " -f 3 | cut -f 1)::

git-ls-tree listet die Objekt-ID für $file in Überarbeitung $REV wird dies aus der Ausgabe herausgeschnitten und als Argument für git-cat-file die eigentlich heißen müsste git-cat-object und übergibt dieses Objekt einfach an stdout .


Hinweis: Seit Git 2.11 (Q4 2016) können Sie einen Inhaltsfilter auf die git cat-file Ausgabe.

Siehe Commit 3214594 , 7bcf341 übertragen (09. September 2016), 7bcf341 übertragen (09. September 2016), und Übergabe b9e62f6 , Commit 16dcc29 (24 Aug 2016) von Johannes Schindelin ( dscho ) .
(Zusammengefasst von Junio C. Hamano -- gitster -- in 7889ed2 übertragen , 21. September 2016)

git config diff.txt.textconv "tr A-Za-z N-ZA-Mn-za-m <"
git cat-file --textconv --batch

Anmerkung: " git cat-file --textconv "Kürzlich (2017) traten Segfehler auf, die in Git 2.15 (Q4 2017) behoben wurden.

Voir cc0ea7c übertragen (21. September 2017) von Jeff King ( peff ) .
(Zusammengefasst von Junio C. Hamano -- gitster -- in bfbc2fc übertragen , 28. September 2017)

564voto

c-a Punkte 5758

Wenn Sie Folgendes wünschen ersetzen/überschreiben den Inhalt einer Datei in Ihrem aktuellen Zweig mit dem Inhalt einer Datei aus einer früheren Übertragung oder einem anderen Zweig zu vergleichen, können Sie dies mit diesen Befehlen tun:

git checkout 08618129e66127921fbfcbc205a06153c92622fe path/to/file.txt

o

git checkout mybranchname path/to/file.txt

Sie müssen diese Änderungen dann übertragen, damit sie im aktuellen Zweig wirksam werden.

171voto

Milan Babuškov Punkte 57324

Sie müssen den vollständigen Pfad zu der Datei angeben:

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:full/repo/path/to/my_file.txt

141voto

jmarceli Punkte 17378

El am einfachsten Weg ist zu schreiben:

git show HASH:file/path/name.ext > some_new_name.ext

wo:

  • HASH ist die SHA-1-Hash-Nummer der Git-Revision
  • datei/pfad/name.ext ist der Name der gesuchten Datei
  • irgendein_neuer_name.ext ist der Pfad und Name, unter dem die alte Datei gespeichert werden soll

Exemple

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:my_file.txt > my_file.txt.OLD

Dies spart meine_datei.txt aus der Revision 27cf8e als eine neue Datei mit dem Namen meine_datei.txt.OLD

Es wurde mit Git 2.4.5 getestet.

Wenn Sie möchten, dass wiederherstellen gelöscht Datei können Sie verwenden HASH~1 (ein Commit vor dem angegebenen HASH).

BEISPIEL:

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8~1:deleted_file.txt > deleted_file.txt

19voto

jsina Punkte 3609
git checkout {SHA1} -- filename

Dieser Befehl ruft die kopierte Datei aus einer bestimmten Übertragung ab.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X