web-dev-qa-db-fra.com

Comment obtenir une copie d'une ancienne version d'un fichier dans un référentiel git?

J'ai une version d'un .tex fichier d'un certain nombre de validations dont j'aimerais obtenir une copie. J'ai la valeur de hachage sha1 pour le commit qui a la version de ce fichier que je veux. Je ne souhaite pas remplacer la version actuelle du fichier. Au contraire, je veux simplement en obtenir une copie distincte qui reflète son état dans l'ancienne version.

De nombreuses questions similaires suggèrent d'utiliser git checkout <sha1> -- file.tex, mais cela ne fait que donner "erreur: pathspec 'file.tex' ne correspond à aucun fichier connu de git."

Le fichier qui m'intéressait existait à l'origine dans le répertoire de niveau supérieur du référentiel. Je suis actuellement dans un sous-répertoire du référentiel essayant d'exécuter cette commande afin d'obtenir l'ancienne version de file.tex dans le sous-répertoire.

Est-ce possible? Comment puis-je faire ceci?

39
jbranchaud

Vous pouvez utiliser git cat-file pour vider le contenu du fichier vers la sortie standard et le rediriger vers la destination souhaitée:

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

Le ./ est nécessaire si vous êtes dans un sous-répertoire du référentiel, si vous êtes au niveau supérieur du référentiel, il peut être omis. En outre, cela peut ne pas fonctionner dans les anciennes versions de git, auquel cas vous devrez fournir explicitement le chemin complet du fichier par rapport à la racine du référentiel.

64
qqx

Je pense que la meilleure solution est d'écraser temporairement votre fichier. Dans votre niveau supérieur de votre référentiel:

git checkout <sha1> file.tex
cp file.tex directory
git checkout file.tex
9
William Seiti Mizuta

Utilisez git show avec des chemins de référentiel absolus:

workdir $ git show revision: repo/module/package/code.file> code.file.old

ou des chemins relatifs au répertoire courant:

package $ git show revision: ./ code.file> workdir/code.file.old

Contrairement à l'extraction d'un fichier, show ne change pas intrinsèquement votre espace de travail, vous pouvez faire tout ce que vous voulez avec la sortie.

Merci à cette réponse , et bien sûr voir tous les détails dans le manuel .

1
gws