web-dev-qa-db-fra.com

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

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 un peu de travail, ce qui me permettait de récupérer facilement grâce à Time Machine. Mais existe-t-il un moyen de supprimer/annuler la suppression de tels fichiers? Traversé le manuel et googlé mais ne peut rien voir. Des plugins?

Je suis probablement en train de répondre à ma propre question ici, mais les fichiers ont disparu du répertoire et ne sont pas dans la corbeille à récupérer. Je suppose donc que Supprimer est irrévocable?

p.s. Je sais que hg forget ou hg remove -Af supprimera sans supprimer du répertoire, mais ma question concerne l'erreur que j'ai commise, par opposition à la réflexion sur l'action.

95
PurplePilot

Commencez par utiliser hg grep pour trouver le fichier supprimé que vous souhaitez récupérer. Le résultat de cette commande vous montrera la dernière révision pour laquelle le fichier était présent, ainsi que le chemin du fichier supprimé . Deuxièmement, exécutez hg revert -r <revision number> <path to deleted file> engagé dans la tête.

146
BungleFeet

Citation du commentaire:

J'ai mis en place un référentiel, validé par tous, 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
8
mrucci

Eh bien cela a fonctionné pour moi.

hg revert -r revision pathToTheFile
5
Shweta

Pour Mercurial 1.6 et supérieur

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

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

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

Ensuite, vous pouvez revenir au fichier avec la révision précédente (avec d’autres réponses):

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

Vous pouvez utiliser un modèle de nom de fichier pour vous adapter à vos connaissances, par exemple, vous pouvez utiliser **/NAME.c pour rechercher dans tous les répertoires. Vous pouvez en apprendre plus à ce sujet dans File Name Patters . Et utilisez ce lien pour connaître le nouveau spécifications de revset .

4
PhoneixS

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

Utilisation de Trouvez rapidement les fichiers supprimés dans l’historique du référentiel Mercurial? + xargs + tr, rétablit tous les suppressions de révision -3 à la version de 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 contient 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 \n pour le moment.

1
keflavich

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.

0

Vous pouvez annuler le dernier commit sur un référentiel avec hg rollback. Un seul niveau d'annulation est disponible. Par conséquent, si vous supprimez plusieurs validations, 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.

0
ataylor

Vous pouvez supprimer les révisions validées à l'aide de la commande hg strip, 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 de jeux de modifications de Mercurial.

0
daniel kullmann

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
0
Naveen Kumar V