Existe-t-il un moyen de supprimer l’historique d’un seul fichier dans Mercurial?

Je pense que je connais déjà la réponse à cette question mais pensais que je demanderais quand même:

Nous avons un fichier qui a été ajouté à un référentiel Mercurial contenant des informations sensibles. Existe-t-il un moyen de supprimer ce fichier avec son historique de modifications sans supprimer l’ensemble du repository?

Non, vous ne pouvez pas. Lisez les modifications qui n’auraient jamais dû figurer dans le livre rouge de Mercurial à ce sujet. et en particulier les modifications sensibles qui échappent à la sous-section, qui contient ce paragraphe:

Mercurial ne fournit pas non plus un moyen de faire disparaître complètement un fichier ou un ensemble de modifications de l’histoire, car il n’ya aucun moyen d’imposer sa disparition; quelqu’un pourrait facilement modifier sa copie de Mercurial pour ignorer ces directives. En outre, même si Mercurial fournissait une telle capacité, une personne qui n’avait tout simplement pas activé le changement de fichier «make this file» ne serait pas affectée. . En effet, aucun système de contrôle de révision dissortingbué ne peut faire disparaître les données de manière fiable. Fournir l’illusion d’un tel contrôle pourrait facilement donner une fausse impression de sécurité et être pire que de ne pas le fournir du tout.

La méthode habituelle pour annuler les modifications validées est supscope par mercurial via la commande backout (encore une fois, mercurial book: gérer les modifications validées ) mais les informations ne disparaissent pas du référentiel: puisque vous ne savez jamais qui a cloné exactement votre référentiel faux sentiment de sécurité, comme expliqué ci-dessus.

Il est exact que vous ne pouvez pas facilement supprimer un fichier particulier de Mercurial dans le sens où cela perturberait tous les ID de modifications de votre référentiel. Lorsque vous modifiez les ID de jeu de modifications, tout le monde doit re-cloner le référentiel. Consultez la page Wiki sur la modification de l’historique pour obtenir des informations sur les conséquences de la modification de l’historique dans Mercurial.

Si cela vous convient (référentiel interne dans une entreprise), examinez l’ extension de conversion . Il peut effectuer des conversions hg → hg et dispose d’un argument –filemap qui peut être utilisé pour exclure des fichiers, entre autres.

C’est possible localement, mais pas globalement, et cela change l’ID de chaque validation après le point auquel le fichier a été ajouté. Pour que le changement prenne en compte, vous devez avoir access à chaque copie du référentiel, en particulier à celles qui sont extraites ou extraites.

Cela dit, j’ai suivi la séquence d’ édition de l’historique décrite sur le wiki Mercurial pour supprimer un fichier de l’un de mes référentiels. Cette séquence suppose que la révision 1301: 5200a5a10d8b a ajouté le path/to/badfile.cfg fichier path/to/badfile.cfg , qui n’a été modifié dans aucune révision ultérieure:

  1. Activez l’extension MQ dans votre .hgrc :

     [extensions] mq = 
  2. Tirez les changements récents de l’amont.

     hg pull 
  3. Importer tout de l’ajout de fichier dans MQ:

     hg qimport -r 1301:tip hg qpop -a 
  4. Supprimez le fichier du commit qui l’a ajouté.

     hg qpush 1301.diff hg forget path/to/badfile.cfg hg qrefresh 
  5. Convertissez les patchs en nouvelles révisions Mercurial.

     hg qpush -a hg qfinish -a 
  6. Poussez les nouvelles révisions en amont.

     hg push -f 
  7. Sur le référentiel en amont et chaque autre copie, supprimez les anciennes révisions.

     hg ssortingp 5200a5a10d8b 

Attention : cette étape peut détruire le travail, sauf si vous êtes prudent. Si quelqu’un a commis quelque chose depuis la dernière fois que vous avez tiré de l’amont, il vous faudra alors rebasculer ce travail avant de le supprimer. Malheureusement, l’extension de rebase n’est pas utile ici; vous devrez à nouveau utiliser MQ, en convertissant les nouveaux commits en correctifs que vous appliquerez au nouveau conseil.

Bonne chance.

Cela peut être fait en moins de 10 min. dans un référentiel unique, bien qu’il y ait des conséquences.

Comment: utiliser hg convert comme décrit dans cet excellent guide . Fondamentalement, vous “convertissez” un repo Hg en un nouveau référentiel Hg, mais vous devez spécifier une liste de fichiers à exclure lors de la conversion. Ceci est un extrait des étapes clés:

 Make sure all your teammates have pushed their local changes to the central repo (if any) Backup your repository Create a "map.txt" file: # this filemap is used to exclude specific files exclude "subdir/filename1.ext" exclude "subdir/filename2.ext" exclude "subdir2" Run this command: hg convert --filemap map.txt c:/oldrepo c:/newrepo NOTE: You have to use "forward-slash" in paths, even on windows. Wait and be patient Now you have a new repo at c:\newrepo but without the files 

Quant aux conséquences …

  • tous les ID de modifications après que les fichiers à exclure ont été ajoutés seront différents
  • le nouveau référentiel principal “propre” devra être mis en place manuellement à la place du référentiel existant
  • tous les membres de l’équipe devront faire de nouveaux clones du repository principal
  • tout autre service qui s’intègre à Hg peut nécessiter une attention particulière (par exemple, le suivi des problèmes, un système de révision du code, etc.).

transplantation de hg, puis bande de hg