Question Comment récupérer un seul fichier à partir 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 le sauvegarder 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 de ligne de commande, le plus proche que j'ai eu était:

git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt

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

Fondamentalement, je cherche quelque chose comme svn chat.


643
2018-03-04 11:43


origine


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 de révision habituel, ce qui signifie que vous pouvez utiliser l'une des méthodes suivantes:

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

Pointe Il est important de se rappeler que lorsque vous utilisez "git show", spécifiez toujours un chemin depuis la racine du référentiel, pas votre position de répertoire actuelle.

(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 a été fait avec un peu de plomberie:

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

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

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

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


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

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

cat-file: soutien --textconv/--filters en mode batch

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 magasin d'objets Git, autorisé à effectuer les conversions" outside-world-to-Git "(par exemple conversions de fin de ligne et application du -filter), et il avait la fonction par défaut dès les premiers jours, son opération inverse "git cat-file", qui prend un objet du magasin d'objets Git et extériorise 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

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

Voir commettre cc0ea7c (21 sept. 2017) par Jeff King (peff).
(Fusionné par Junio ​​C Hamano - gitster - dans commettre bfbc2fc28 septembre 2017) 


581
2018-03-04 12:22



Si vous souhaitez remplacer / écraser le contenu d'un fichier dans votre branche actuelle avec le contenu du fichier d'une validation précédente ou d'une branche différente, 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 valider ces modifications pour qu'elles soient efficaces dans la branche actuelle.


395
2017-11-18 19:41



Vous devez fournir le chemin complet du fichier:

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

128
2018-03-04 11:46



le plus facile manière d'écrire:

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

où:

  • HACHER 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 économisera mon_fichier.txt de la révision b0d78b4 comme un nouveau fichier avec le nom mon_fichier.txt.OLD

Il a été testé avec Git 2.4.5.

Si tu veux récupérer supprimé fichier que vous pouvez utiliser HASH~1 (un commit avant HASH spécifié).

EXEMPLE:

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

56
2017-07-07 13:55



Dans Windows, avec Git Bash:

  • dans votre espace de travail, modifiez dir dans le dossier où vit votre fichier
  • git show cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file.ext > old.ext

7
2018-03-02 16:17



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

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

le " les guillemets sont nécessaires pour préserver les sauts de ligne.


6
2018-01-01 16:56



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

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

3
2017-07-24 02:34



Récupère le fichier d'un commit précédent en vérifiant le commit précédent et en copiant le fichier.

  • Notez dans quelle branche vous vous trouvez: branche git
  • Checkout le commit précédent que vous voulez: git checkout 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
  • Copiez le fichier que vous voulez dans un emplacement temporaire
  • Vérifiez la succursale que vous avez démarrée: git checkout theBranchYouNoted 
  • Copiez dans le fichier que vous avez placé dans un emplacement temporaire
  • Validez votre changement à git: git commit -m "added file ?? from previous commit"

-2
2017-07-22 15:05