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 .
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:
- nom de la succursale (comme suggéré par ash )
-
HEAD
+ x nombre de^
caractères - le hachage SHA1 d'une révision donnée
- 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 discontinumê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)
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.
vous devez fournir le chemin complet du fichier:
git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:full/repo/path/to/my_file.txt
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
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
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.
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
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"