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

j'ai un dépôt Git et j'aimerais voir comment certains fichier regardé il y a quelques mois. J'ai trouvé la révision à cette date, et c'est 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 . J'ai besoin de voir ce que fait un fichier ressemble et également enregistrer dans un fichier.

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

git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt

cependant, cette commande montre une diff et pas le fichier contenu. Je sais que je peux plus tard utiliser quelque chose comme PAGER=cat et rediriger la sortie vers un fichier, mais je ne sais pas comment obtenir le contenu réel du fichier.

en gros, je cherche quelque chose comme svn cat .

664
demandé sur Peter Mortensen 2009-03-04 14:43:13

8 réponses

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 prend le style habituel de révision, ce qui signifie que vous pouvez utiliser l'un des suivants:

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

Tip il est important de se rappeler que lors de l'utilisation de" git show ", toujours spécifier un chemin à partir de la racine du dépôt , pas votre position actuelle de 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, qui a été fait avec un peu de plomberie:

git ls-tree <rev>

afficher une liste d'un ou plusieurs objets 'blob' dans une commit

git cat-file blob <file-SHA1>

chat un fichier tel qu'il a été commis à l'intérieur d'une révision spécifique (similaire à svn chat.) 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 de l'objet pour $file dans la révision $REV, celui-ci est coupé de la sortie et utilisé comme argument pour git-cat-file, qui devrait vraiment être appelé git-cat-object, et vide simplement cet objet pour stdout.


Note: depuis Git 2.11 (Q4 2016), vous pouvez appliquer un filtre de contenu à la sortie git cat-file !

Voir commettre 3214594 , commettre 7bcf341 (09 Sep 2016), commettre 7bcf341 (09 Sep 2016), et commettre b9e62f6 , commettre 16dcc29 (24 Août 2016) par Johannes Schindelin ( dscho ) .

(fusionné par Junio C. Hamano -- gitster -- in commit 7889ed2 , 21 septembre 2016)

cat-file : prise en charge --textconv / --filters en mode discontinu

même si " git hash-objects ", qui est un outil pour prendre un flux de données sur le système de fichiers et le mettre dans le git objet store, autorisé à effectuer les conversions" outside-world-to-Git " (par exemple les conversions de fin de ligne et l'application du filtre propre), et il avait la caractéristique sur par par défaut dès les premiers jours, son fonctionnement inverse " git cat-file ", qui prend un objet du magasin d'objet Git et externalisent pour la consommation par le monde extérieur, manquait d'un 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

Note: " git cat-file --textconv " commencé segfaulting récemment (2017), qui a été corrigé dans Git 2.15 (T4 2017)

voir commit cc0ea7c (21 septembre 2017) par Jeff King ( peff ) .

(Regroupées par Junio C Hamano -- gitster -- dans commettre bfbc2fc , 28 septembre 2017)

597
répondu VonC 2017-10-14 04:46:00

Si vous voulez remplacer/écraser le contenu d'un fichier dans votre branche avec le contenu du fichier d'une livraison antérieure ou d'une autre branche, vous pouvez le faire avec ces commandes:

git checkout 08618129e66127921fbfcbc205a06153c92622fe path/to/file.txt

ou

git checkout mybranchname path/to/file.txt

vous devrez alors engager ces modifications pour qu'elles soient efficaces dans la branche actuelle.

413
répondu c-a 2016-12-01 16:12:41

vous devez fournir le chemin complet du fichier:

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:full/repo/path/to/my_file.txt
130
répondu Milan Babuškov 2018-07-20 23:52:09

le plus facile la façon est d'écrire:

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

où:

  • HASH est le Git de révision de hachage SHA-1 numéro de
  • 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 sauvera my_file.txt de la révision b0d78b4 comme un nouveau fichier avec le nom my_file.txt.Ancien

il a été testé avec Git 2.4.5.

si vous voulez récupérer le fichier supprimé vous pouvez utiliser HASH~1 (une propagation avant le hachage spécifié).

exemple:

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8~1:deleted_file.txt > deleted_file.txt
58
répondu jmarceli 2018-07-20 23:56:33

Dans Windows, avec Git Bash:

  • dans votre espace de travail, changez le dir dans le dossier où votre fichier VIT
  • git show cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file.ext > old.ext
8
répondu Alessandro Jacopson 2015-03-02 16:17:24

et de bien le jeter dans un fichier (sur Windows au moins) - Git Bash:

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

les citations " sont nécessaires pour préserver newlines.

6
répondu Mr_and_Mrs_D 2018-07-20 23:53:50

cela vous aidera à obtenir tous les fichiers supprimés entre les propagations sans spécifier le chemin, utile s'il y a beaucoup de fichiers supprimés.

git diff --name-only --diff-filter=D $commit~1 $commit | xargs git checkout $commit~1
3
répondu Adrian Gunawan 2014-07-24 02:34:05

récupérez le fichier d'une propagation précédente en vérifiant la propagation précédente et en copiant le fichier.

  • Note quelle branche vous êtes: branche git
  • la Caisse de la précédente livraison que vous souhaitez: git checkout 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
  • copier le fichier que vous voulez à un emplacement temporaire
  • caisse la succursale que vous avez commencée à partir de: git checkout theBranchYouNoted
  • copie dans le dossier que vous avez placé dans un endroit temporaire
  • Valider votre changement de git: git commit -m "added file ?? from previous commit"
-2
répondu rocketInABog 2012-01-10 00:14:59