2013-02-21 8 views
23

Ich habe eine Version einer .tex Datei aus einer Reihe von Commits her, dass ich gerne eine Kopie von bekommen würde. Ich habe den Hash-Wert sha1 für das Commit, das die Version dieser Datei hat, die ich möchte. Ich möchte die aktuelle Version der Datei nicht ersetzen. Stattdessen möchte ich nur eine separate Kopie davon erhalten, die seinen Zustand in der älteren Version widerspiegelt.Wie bekomme ich eine Kopie einer älteren Version einer Datei in einem Git-Repository?

Viele ähnliche Fragen schlagen vor, git checkout <sha1> -- file.tex zu verwenden, aber das gibt nur "error: pathspec 'file.tex' hat keine Datei (en) bekannt, die git bekannt sind."

Die Datei, an der ich interessiert bin, befand sich ursprünglich im obersten Verzeichnis des Repositorys. Ich bin derzeit in einem Unterverzeichnis des Repositorys, das versucht, diesen Befehl auszuführen, um die ältere Version von file.tex im Unterverzeichnis abzurufen.

Ist das möglich? Wie kann ich das machen?

+0

Erstellen Sie eine Kopie der aktuellen Datei, und führen Sie dann 'git checkout datei.ext'? – adamdunson

+0

Mein genauer Anwendungsfall. Prost! –

Antwort

39

Sie git cat-file verwenden können, um den Inhalt der Datei auf die Standardausgabe und umleiten, dass in Ihrem gewünschten Ziel zu entleeren:

git cat-file -p <sha1>:./file.tex > wherever.tex 

Die ./ ist notwendig, Wenn Sie sich in einem Unterverzeichnis des Repositorys befinden, kann es sein, dass Sie sich in der obersten Ebene des Repositorys befinden. Dies funktioniert möglicherweise auch nicht in älteren Versionen von git. In diesem Fall müssten Sie explizit den vollständigen Pfad zur Datei relativ zum Stammverzeichnis des Repositorys angeben.

+0

Danke, das ist genau die Funktionalität, nach der ich gesucht habe. – jbranchaud

+1

Beachten Sie, dass im Gegensatz zu vielen anderen git-Befehlen der Dateiname (hier "file.tex") der Name aus dem Stamm des Git Repos sein muss; Wenn du also foo/file.tex willst und du im Unterverzeichnis foo stehst, kannst du das obige nicht eingeben, du müsstest : foo/file.tex eingeben, obwohl du bereits in foo bist. – Daniel

+0

@Daniel, das ist wahr. Aber zumindest mit den neuesten Versionen von git können Sie '' 'immer verwenden, um auf das aktuelle Verzeichnis zu verweisen. Ich habe meine Antwort aktualisiert, um dies zu berücksichtigen. – qqx

5

Ich denke, dass die beste Lösung ist, Ihre Datei zeitlich zu überschreiben. In der obersten Ebene Ihres Ihres Repositorys:

git checkout <sha1> file.tex 
cp file.tex directory 
git checkout file.tex 
+0

das ist die beste Lösung, die ich bisher gesehen habe. Ich bin immer noch genervt, dass es keine Möglichkeit gibt, diese Datei einfach direkt zu greifen. – jbranchaud

+3

Dieser letzte Befehl müsste "git checkout HEAD file.tex" sein. Der erste checkout-Befehl würde sowohl den Index als auch die Arbeitsbaumkopie modifizieren, so dass das Auschecken ohne Angabe einer Revision immer noch die ältere Version verwendet. – qqx

Verwandte Themen