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.
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:
HEAD
+ x nombre de _^
_ caractères 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 lotsMê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)
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.
Vous devez fournir le chemin complet du fichier:
git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:full/repo/path/to/my_file.txt
Le le plus simple moyen est d'écrire:
git show HASH:file/path/name.ext > some_new_name.ext
où:
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
Sous Windows, avec Git Bash:
git show cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file.ext > old.ext
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.
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