web-dev-qa-db-fra.com

Comment récupérer un seul fichier d'une révision spécifique dans Git

J'ai un référentiel Git et j'aimerais voir à quoi ressemblait un fichier il y a quelques mois. J'ai trouvé la révision à cette date, et c'est 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8. J'ai besoin de voir à quoi ressemble un fichier et de l'enregistrer dans un fichier.

J'ai réussi à voir le fichier en utilisant gitk, mais il n'a pas l'option de le sauvegarder. J'ai essayé avec des outils en ligne de commande, le plus proche que j'ai obtenu était:

git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt

Cependant, cette commande affiche un diff et non le contenu du fichier. Je sais que je peux utiliser ultérieurement quelque chose comme PAGER=cat et rediriger la sortie vers un fichier, mais je ne sais pas comment accéder au contenu du fichier.

En gros, je cherche quelque chose comme svn cat.

767
Milan Babuškov

Pour compléter votre propre réponse, la syntaxe est en effet

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

La commande reprend le style de révision habituel, ce qui signifie que vous pouvez utiliser l’un des éléments suivants:

  1. nom de la branche (comme suggéré par cendres )
  2. HEAD + x nombre de _^_ caractères
  3. Le hash SHA1 d'une révision donnée
  4. Les premiers (peut-être 5) caractères d'un hachage SHA1 donné

Astuce Il est important de se rappeler qu'en utilisant "_git show_", spécifiez toujours un chemin depuis la racine. du référentiel , pas la position actuelle de votre répertoire.

(Bien que Mike Morearty mentionne que, au moins avec git 1.7.5.4, vous pouvez spécifier un chemin relatif en mettant "_./_" au début du chemin - par exemple:

_git show HEAD^^:./test.py
_

)


Avant git1.5.x, cela était fait avec de la plomberie:

_git ls-tree <rev>_
affiche une liste d'un ou plusieurs objets 'blob' dans un commit

_git cat-file blob <file-SHA1>_
cat un fichier tel qu’il a été validé dans une révision spécifique (similaire à svn cat). utilisez git ls-tree pour récupérer la valeur d'un fichier donné-sha1

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

git-ls-tree liste l'ID d'objet de $ file dans la révision $ REV, ceci est coupé de la sortie et utilisé comme argument de git-cat-file, qui devrait vraiment s'appeler git-cat-object, et dumpe simplement cet objet à stdout.


Remarque: depuis Git 2.11 (Q4 2016), vous pouvez appliquer un filtre de contenu à la sortie _git cat-file_!

Voir commit 3214594 , commit 7bcf341 (09 septembre 2016), commit 7bcf341 (09 sept. 2016), et commit b9e62f6 =, commit 16dcc29 (24 août 2016) par Johannes Schindelin (dscho) .
(Fusionnée par Junio ​​C Hamano - gitster - dans commit 7889ed2 , 21 septembre 2016)

_cat-file_: support _--textconv_/_--filters_ en mode de traitement par lots

Même si " git hash-objects ", qui est un outil permettant de prendre un flux de données sur un système de fichiers et de le placer dans le magasin d'objets Git, a autorisé l'exécution du "lien externe à Git "conversions (par exemple, conversions de fin de ligne et application du filtre de nettoyage), et la fonction était activée par défaut dès le début, son opération inverse" git cat-file ", qui prend un objet dans le magasin d’objets Git et extériorise pour la consommation extérieure, n’avait pas de mécanisme équivalent pour exécuter le "Git-to-outside-world"

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

Remarque: "_git cat-file --textconv_" a commencé à corriger une erreur de segmentation récemment (2017), ce qui a été corrigé dans Git 2.15 (T4 2017).

Voir commit cc0ea7c (21 sept. 2017) par Jeff King (peff) .
(Fusionnée par Junio ​​C Hamano - gitster - dans commit bfbc2fc , 28 septembre 2017)

676
VonC

Si vous souhaitez remplacer/écraser le contenu d'un fichier de votre branche actuelle avec le contenu du fichier d'une validation précédente ou d'une autre branche, vous pouvez le faire avec les commandes suivantes:

git checkout 08618129e66127921fbfcbc205a06153c92622fe path/to/file.txt

ou

git checkout mybranchname path/to/file.txt

Vous devrez ensuite valider ces modifications pour qu'elles soient effectives dans la branche actuelle.

487
c-a

Vous devez fournir le chemin complet du fichier:

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:full/repo/path/to/my_file.txt
141
Milan Babuškov

Le le plus simple moyen est d'écrire:

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

où:

  • HASH est le numéro de hachage SHA-1 de la révision Git
  • fichier/chemin/nom.ext est le nom du fichier que vous recherchez
  • some_new_name.ext est le chemin et le nom où l'ancien fichier doit être sauvegardé

Exemple

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

Cela permettra d'économiser mon_fichier.txt de la révision 27cf8e sous forme de nouveau fichier portant le nom mon_fichier.txt.OLD

Il a été testé avec Git 2.4.5.

Si vous voulez récupérer supprimé fichier, vous pouvez utiliser HASH~1 (un commit avant le hachage spécifié).

EXEMPLE:

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

Sous Windows, avec Git Bash:

  • dans votre espace de travail, changez dir dans le dossier où réside votre fichier
  • git show cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file.ext > old.ext
10

Et pour le déposer dans un fichier (sous Windows au moins) - Git Bash:

$ echo "`git show 60d8bdfc:src/services/LocationMonitor.Java`" >> LM_60d8bdfc.Java

Les citations " sont nécessaires afin de préserver les nouvelles lignes.

6
Mr_and_Mrs_D

Cela vous aidera à obtenir tous les fichiers supprimés entre les validations sans spécifier le chemin, utile si de nombreux fichiers sont supprimés.

git diff --name-only --diff-filter=D $commit~1 $commit | xargs git checkout $commit~1
3
Adrian Gunawan