Comment puis-je récupérer un fichier supprimé dans Mercurial (le cas échéant)?

100

Par accident, en utilisant une interface graphique plutôt que CLI, j'ai supprimé tous les fichiers d'un projet Mercurial.

J'ai récupéré avec Revert ok et j'ai perdu du travail, ce que je pourrais facilement récupérer grâce à ma machine à remonter le temps. Mais existe-t-il un moyen de supprimer / annuler la suppression de tels fichiers? J'ai parcouru le manuel et cherché sur Google, mais je ne peux rien voir. Des plugins?

Je réponds probablement à ma propre question ici mais les fichiers ont disparu du répertoire et n'étaient pas dans la poubelle pour récupérer, donc je suppose que Remove est irrévocable?

ps Je sais que hg forgetou hg remove -Afvais supprimer sans supprimer du répertoire, mais ma question a à voir avec l'erreur que j'ai faite par opposition à une réflexion cool sur l'action.

PurplePilot
la source
1
vous devriez être en mesure de récupérer une révision plus ancienne et tout va bien (bien sûr, cela ne fonctionne que si vous n'avez pas réécrit l'historique)
retour le
le problème était que j'avais commis, apporté des modifications, R (supprimé). Donc, après cette séquence, oui, j'avais le commit précédent, alors je suis revenu à cela et comme j'ai une sauvegarde sous la forme d'une machine à remonter le temps, je pourrais obtenir les derniers changements, puis les ajouter, puis valider. Cependant, si je n'avais pas eu de backuop, les modifications auraient été perdues.
PurplePilot
1
Question connexe qui vous permet de rechercher uniquement les noms de fichiers (rapide): stackoverflow.com/questions/1013550/…
Michael Pryor

Réponses:

152

Tout d'abord, utilisez hg greppour trouver le fichier supprimé que vous souhaitez récupérer. La sortie de cette commande vous montrera la dernière révision pour laquelle le fichier était présent et le chemin vers le fichier supprimé. Deuxièmement, exécutez hg revert -r <revision number> <path to deleted file> Le fichier supprimé sera maintenant dans votre copie de travail, prêt à être remis en tête.

BungleFeet
la source
5
a bien fonctionné pour moi, merci. recherchait la réponse à la question "Comment restaurer un fichier que j'ai volontairement supprimé?"
nc.
à partir de l'éclipse, cela peut être fait en cliquant avec le bouton droit sur le fichier Sélectionnez l'équipe -> Revert
Emil
3
Une autre façon de trouver la révision contenant le fichier esthg log -I '**file.ext'
mpen
2
Juste un FYI: vous voulez le numéro de révision du commit qui a encore le fichier, PAS celui qui l'a supprimé!
Lukas Knuth
8

Citation du commentaire:

J'ai mis en place un référentiel, tout validé, supprimé puis validé à nouveau

Si tel est le cas, il vous suffit de mettre à jour le répertoire de travail avec la révision précédente:

$ hg update -C -r-2

Notez le numéro de révision négatif. Si les fichiers que vous avez supprimés ne sont pas dans la révision précédente, vous pouvez les trouver en utilisant:

$ hg log -v
mrucci
la source
5

Eh bien, cela a fonctionné pour moi.

hg revert -r revision pathToTheFile
Shweta
la source
4

Pour Mercurial 1.6 et supérieur

Si vous connaissez le nom du fichier de suppression, vous pouvez trouver sa révision facilement avec:

hg log -r "removes('NAME.c')"

Cela vous donnera la révision dans laquelle un fichier appelé NAME.c (à la racine) est supprimé.

Ensuite, vous pouvez rétablir le fichier à la révision précédente avec (comme les autres réponses):

hg revert -r <revision number> <path to deleted file>

Vous pouvez utiliser un modèle de nom de fichier à la place pour vous adapter à ce que vous savez, par exemple vous pouvez utiliser **/NAME.cpour rechercher dans tous les répertoires. Vous pouvez en savoir plus sur File Name Patters . Et utilisez ce lien pour connaître les nouvelles spécifications de revset .

PhoneixS
la source
1

Un ajout à la réponse acceptée - c'est plus rapide si vous souhaitez annuler toutes les suppressions dans un commit. J'ai supprimé un grand dossier contenant quelques centaines de fichiers et je l'ai fait hg addremove, ce qui n'était pas du tout mon intention, j'ai donc dû annuler toutes ces suppressions.

Utiliser la recherche de fichiers supprimés dans l'historique du référentiel Mercurial, rapidement? + xargs + tr, rétablit toutes les suppressions de révision -3 à la version de la révision -4:

hg log -r -3 --template "{rev}: {file_dels}\n" | tr ' ' '\n' | xargs hg revert -r -4 

Notez que cela échouera si l'un de vos fichiers comporte des espaces dans le nom; http://hgbook.red-bean.com/read/customizing-the-output-of-mercurial.html ne semble pas avoir de modèles où {file_dels}est divisé par \npour le moment.

Keflavich
la source
0

Vous pouvez annuler le dernier commit sur un repo avec hg rollback. Il n'y a qu'un seul niveau de restauration disponible, donc si vous avez effectué la suppression avec plus d'un commit, cela n'annulera pas complètement votre modification. Cela ne fonctionne que sur votre référentiel local, donc si vous avez poussé, vous ne pourrez pas l'annuler dans le référentiel distant.

ataylor
la source
1
Non, cela ne fonctionne pas. J'utilise un Mac avec Mercurial Distributed SCM (version 1.4.1 + 20091201). J'ai mis en place un référentiel, tout validé, supprimé puis validé à nouveau, mais cela ne ramène qu'une liste des fichiers marqués comme R (emoved) mais ne ramène pas réellement les fichiers. Si je marque les fichiers comme R (emoved) et Rollback avant de valider, rien ne se passe non plus.
PurplePilot
Une fois que vous avez effectué la restauration hg, votre dépôt sera restauré, mais votre répertoire de travail actuel aura toujours vos modifications. Dites simplement à hg de faire une mise à jour propre de la révision restaurée, maintenant sur la pointe: hg up -C.
ataylor
1
hg rollbackne récupérera pas le fichier supprimé car la suppression du fichier ne fait pas partie de la transaction de validation.
mrucci
4
C'est vrai. Si vous cherchez à obtenir des modifications qui n'ont pas été validées avant la suppression, elles sont perdues.
ataylor
0

Vous pouvez supprimer les révisions validées à l'aide de la hg stripcommande fournie par l'extension mq (Mercurial Queues). Cela devrait vous rendre vos fichiers.

Faites une sauvegarde avant d'essayer, car cela modifiera la base de données des ensembles de modifications de Mercurial.

Daniel Kullmann
la source
0

La méthode ci-dessous est simple et tellement stupide qu'elle ne peut pas se tromper. Si vous avez supprimé ou renommé plusieurs fichiers, tout ira bien.

hg clone mydirectory mydirectory1

et maintenant vous démarrez mc (ou Far Manager) et comparez ce qu'il était par rapport à ce qu'il est devenu.

quand c'est fait, supprimez simplement mydirectory1.

18446744073709551615
la source
0

Ce qui suit a fonctionné pour moi.

hg revert -r <Revision Number> <File Name>

(Facultatif, pour rétablir tous les fichiers)

hg revert -r <Revision Number> --all
Naveen Kumar V
la source