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 forget
ou hg remove -Af
vais 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.
Réponses:
Tout d'abord, utilisez
hg grep
pour 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écutezhg 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.la source
hg log -I '**file.ext'
Citation du commentaire:
Si tel est le cas, il vous suffit de mettre à jour le répertoire de travail avec la révision précédente:
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:
la source
Eh bien, cela a fonctionné pour moi.
la source
Pour Mercurial 1.6 et supérieur
Si vous connaissez le nom du fichier de suppression, vous pouvez trouver sa révision facilement avec:
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):
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.c
pour 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 .la source
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:
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\n
pour le moment.la source
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.la source
hg rollback
ne récupérera pas le fichier supprimé car la suppression du fichier ne fait pas partie de la transaction de validation.Vous pouvez supprimer les révisions validées à l'aide de la
hg strip
commande 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.
la source
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.
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
.la source
Ce qui suit a fonctionné pour moi.
(Facultatif, pour rétablir tous les fichiers)
la source