J'ai un référentiel Git et j'aimerais voir à quoi ressemblaient certains fichiers il y a quelques mois. J'ai trouvé la révision à cette date; c'est 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
. J'ai besoin de voir à quoi ressemble un fichier et de l'enregistrer en tant que ("nouveau") fichier.
J'ai réussi à voir le fichier à l'aide gitk
, mais il n'a pas d'option pour l'enregistrer. 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 plus tard utiliser quelque chose comme PAGER=cat
et rediriger la sortie vers un fichier, mais je ne sais pas comment accéder au contenu du fichier réel.
Fondamentalement, je recherche quelque chose comme svn cat .
la source
git show
(sans aide) utilise une syntaxe différente avec deux points.git show 2c7cf:my_file.txt
>
Réponses:
Pour compléter votre propre réponse, la syntaxe est en effet
La commande prend le style de révision habituel, ce qui signifie que vous pouvez utiliser l'une des méthodes suivantes:
HEAD
+ x nombre de^
caractèresAstuce Il est important de se rappeler que lorsque vous utilisez "
git show
", spécifiez toujours un chemin à partir de la racine du référentiel , pas votre position actuelle dans le 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:)
Avec Git 2.23+ (août 2019), vous pouvez également utiliser
git restore
ce qui remplace lagit checkout
commande confuseCela ne restaurerait dans l'arborescence de travail que le fichier tel qu'il est présent dans la branche "source" (
-s
) de validation SHA1somebranch
.Pour restaurer également l'index:
(
-SW
: abréviation de--staged --worktree
)Avant git1.5.x, cela se faisait avec de la plomberie:
git ls-tree <rev>
afficher une liste d'un ou plusieurs objets "blob" dans une validation
git cat-file blob <file-SHA1>
cat un fichier car 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-sha1 donné
git-ls-tree répertorie l'ID d'objet pour $ file dans la révision $ REV, il est coupé de la sortie et utilisé comme argument pour git-cat-file, qui devrait vraiment être appelé git-cat-object, et simplement les dumps cet objet à stdout.
Remarque: depuis Git 2.11 (Q4 2016), vous pouvez appliquer un filtre de contenu à la
git cat-file
sortie!Voir commit 3214594 , commit 7bcf341 (09 sept. 2016), commit 7bcf341 (09 sept. 2016) et commit b9e62f6 , commit 16dcc29 (24 août 2016) par Johannes Schindelin (
dscho
) .(Fusionné par Junio C Hamano -
gitster
- en commit 7889ed2 , 21 sept. 2016)Remarque: "
git cat-file --textconv
" a commencé à segfaulting récemment (2017), qui a été corrigé dans Git 2.15 (Q4 2017)Voir commit cc0ea7c (21 sept. 2017) de Jeff King (
peff
) .(Fusionné par Junio C Hamano -
gitster
- dans commit bfbc2fc , 28 sept. 2017)Notez que pour remplacer / remplacer un fichier par un contenu passé, vous ne devez plus utiliser la commande confuse
git checkout
, maisgit restore
(Git 2.23+, août 2019)Cela ne restaurerait sur l'arborescence de travail que le fichier présent dans le
-s
commit "source" ( ) SHA1.Pour restaurer également l'index:
(
-SW
: abréviation de--staged --worktree
)la source
git show
le contenu est essentiellement vidé sur lastdout
(sortie standard), vous pouvez simplement rediriger cette sortie vers le fichier de votre choix ( tldp.org/LDP/abs/html/io-redirection.html ).git checkout [branch | revision] filepath
est la bonne commandegit checkout
serait remplacer votre fichier par une autre version, par opposition àgit show
, qui vous permet de l'enregistrer sous un autre nom, pour vous d'obtenir et de voir à la fois (la version actuelle et l'ancienne version). La question ne permet pas de savoir si le PO souhaite remplacer sa version actuelle par une ancienne.^^^
peut également être écrit plus généralement~~~
ou, mieux,~3
. L'utilisation de tildes a également l'avantage de ne pas déclencher la correspondance de nom de fichier de certains shells (zsh, par exemple).git rev-parse
gère-rev:path
t-elle la syntaxe? (Dans un git plus récent, vous pouvezgit cat-file -p $REV:path
. Cependant, celagit show
fonctionne aussi pour les chemins de répertoire, donc ce n'est pas seulement plus court, il est généralement plus proche de ce que l'on veut.)Si vous souhaitez remplacer / écraser le contenu d'un fichier dans votre branche actuelle par le contenu du fichier d'une validation précédente ou d'une branche différente, vous pouvez le faire avec ces commandes:
ou
Vous devrez ensuite valider ces modifications pour qu'elles soient effectives dans la branche actuelle.
la source
git show SHA1:PATH
solution imprime uniquement sur stdout.git help checkout
. J'ai dû extraire un sous-répertoire à partir d'une certaine date, et en utilisant cette approche, j'ai pu faire fonctionner cette syntaxe:git checkout @{YYYY-MM-DD} sub-dir
Vous devez fournir le chemin d'accès complet au fichier:
la source
git show --name-only
suffisent aussifull/repo/path/to
et que vous essayez :,git show 27cf8e84:my_file.txt
vous serez récompensé par un message comme: fatal: le chemin d'accès 'full / repo / path / to / my_file.txt' existe, mais pas 'my_file.txt' . Voulez-vous dire '27cf8e84: full / repo / path / to / my_file.txt' aka '27cf8e84: ./ my_file.txt'? C'est comme si Git aurait pu aider directement, mais a choisi d'être pédant ici.Le plus simple est d'écrire:
où:
Exemple
Cela sauvera mon_fichier.txt de la révision 27cf8e en tant que nouveau fichier avec le nom mon_fichier.txt.OLD
Il a été testé avec Git 2.4.5.
Si vous souhaitez récupérer le fichier supprimé , vous pouvez utiliser
HASH~1
(un commit avant le HASH spécifié).EXEMPLE:
la source
git log file/path/name.ext
Sous Windows, avec Git Bash:
git show cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file.ext > old.ext
la source
Et pour bien le vider dans un fichier (sur Windows au moins) - Git Bash:
Les
"
guillemets sont nécessaires pour préserver les nouvelles lignes.la source
git show
syntaxe que je mentionne ci-dessus.Cela vous aidera à obtenir tous les fichiers supprimés entre les validations sans spécifier le chemin, utile s'il y a beaucoup de fichiers supprimés.
la source
cette commande récupère le fichier copié à partir d'un commit spécifique.
la source
Obtenez le fichier d'une validation précédente en extrayant le fichier de validation et de copie précédent.
git checkout 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
git checkout theBranchYouNoted
git commit -m "added file ?? from previous commit"
la source