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.
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.
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
Eh bien cela a fonctionné pour moi.
hg revert -r revision pathToTheFile
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 .
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.
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
.
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.
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.
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