Comment restaurer un répertoire entier à partir de l'historique du référentiel git?

90

Je voudrais restaurer un répertoire entier (récursivement) à partir de l'historique de mon dépôt git.

Il n'y a qu'une seule branche (maître).

Je connais le commit où des erreurs ont été incluses.

Puis-je utiliser le hachage sha1 du commit parent pour restaurer l'état du répertoire tel qu'il était avant l'inclusion des erreurs?

J'ai pensé à quelque chose comme ça:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 path/to/the/folder/

Mais cela n'a pas fonctionné.

le plus recherché
la source
7
essayez d'ajouter '-' entre les révisions et les chemins:git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/
Carlos Campderrós
cela a aidé. Merci beaucoup.
désiré
1
@ CarlosCampderrós Ecrivez cela comme une vraie réponse et collectez vos 15 points avant que quelqu'un d'autre ne le fasse;)
ralphtheninja
@MagnusSkog Je n'étais pas sûr que cela fonctionnerait, alors j'ai fait un commentaire juste pour vérifier. Maintenant que je suis sûr que cela fonctionne, je l'ai écrit comme réponse :)
Carlos Campderrós
2
En règle générale, «cela n'a pas fonctionné» n'est pas très utile. Dites-nous pourquoi cela n'a pas fonctionné, idéalement avec la sortie d'erreur (coupée si elle est très longue).
me_and

Réponses:

154

essayez d'ajouter '-' entre les révisions et les chemins:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/ 

Et si vous souhaitez récupérer un répertoire à partir du commit précédent, vous pouvez remplacer le hachage du commit par HEAD ~ 1, par exemple:

git checkout HEAD~1 -- path/to/the/folder/ 
Carlos Campderrós
la source
même commande, but presque différent: stackoverflow.com/questions/953481/…
cregox
18
Il y a cependant un problème: l'OP ne spécifie pas si le répertoire existe toujours. Pour restaurer un répertoire existant à l'état de validation, le contenu du répertoire doit d'abord être supprimé. Dans les autres cas, les fichiers existants qui n'existaient pas dans l'ancien commit ne seront pas supprimés.
Alberto
7
+1 @Alberto est tout à fait d'accord. J'ai fait un rm -Rf path/to/the/folderalors git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/- Résultat: ce chemin avait exactement les mêmes fichiers que dans ce commit, aucune différence et aucun fichier supplémentaire qui avait été créé après ce commit. C'est ce que je veux.
therobyouknow
2
que fait le --?
Ray Foss
2
@RayFoss cela dit à git que les paramètres suivants sont des fichiers (sinon ils pourraient être confondus avec un hachage de commit, une branche ou autre chose). Habituellement, ils ne sont pas nécessaires mais cela ne fait pas de mal de les mettre
Carlos Campderrós
2

Il existe deux façons simples de procéder:

Si le commit qui incluait les erreurs ne comprenait que les erreurs, utilisez git revertpour inverser les effets de celui-ci.

Sinon, le chemin facile est le suivant:

  1. git checkout 348…
  2. cp -a path/to/the/folder ../tmp-restore-folder
  3. git checkout HEAD # or whatever
  4. rm -rf path/to/the/folder
  5. mv ../tmp-restore-folder path/to/the/folder
  6. git add path/to/the/folder
  7. git commit -m "revert …"
Daniel Pittman
la source
1

Si vous le faites simplement, git checkout <SHA-ID>cela vous déplacera temporairement vers ce sha-commit.

Chaque objet de validation contient la structure entière du disque à ce moment-là, donc si vous avez des fichiers et que vous devez les copier, vous pouvez le faire. Attention cependant, vous ne serez dans aucune branche, vous devrez donc revenir au master avant de copier le fichier dans votre arbre de travail et de le valider.

Mark Fisher
la source
re "revenir au maître" vous voulez dire le maître de caisse?
Pacerier le