Supprimer un fichier et son historique d'un dépôt Mercurial

Posté le 29 octobre 2008

Un système de gestion décentralisée de versions donne un certain confort dans le développement d'une application. En effet, nous pouvons créer en local autant de copies (clone) du dépôt original que nous souhaitons et ainsi travailler sur de nouvelles fonctionnalités, sans craindre de casser quelque chose, puis reverser le tout une fois terminé sur le dépôt original.

Je me suis donc mis à utiliser ce système et j'ai choisi Mercurial (puisqu'il faut bien en choisir un). J'ai donc créé mon dépôt en local puis ajouté mes fichiers, etc... Puis vint le jour où je décidais de rendre public le code source de mon appli, mais seulement voilà, dans mon élan j'avais inclu certains fichiers contenant des informations confidentielles.

Évidemment, certains diront: "D'où l'intérêt de créer un fichier .hgignore à la racine du dépôt pour y inclure les fichiers à ignorer...". Oui seulement j'ai découvert cette fonctionnalité un peu trop tard et même si je le faisais maintenant, ces informations confidentielles pourraient être récupérées dans l'historique avec un simple hg revert ...

C'est donc là qu'intervient la miraculeuse extension convert de Mercurial ! Elle permet de convertir un dépôt Git, Subversion ou autre vers un dépôt Mercurial. Mais elle permet aussi de réaliser une conversion Mercurial vers Mercurial en faisant, au passage, de petites modifications sur le dépôt ainsi converti: par exemple le remplacement des nom d'auteurs de commits ou encore l'exclusion de fichiers du dépôt ainsi que tout leur historique. Nous allons donc créer 2 fichiers textes:

Un auteur.txt qui contiendra les adresses email et les noms d'auteurs à remapper, comme ceci:

jojo@tux=John DOE <john.doe@mondomaine.fr>

et un filemap.txt contenant les fichiers à exclure:

exclude templates/static/monfichier_prive.html
exclude settings.py

Tapez ensuite la commande magique:

hg convert --authors auteur.txt --filemap filemap.txt <mon_depot_orig> <mon_depot_modifie>

Dernière étape, on clone le nouveau dépôt obtenu <mon_depot_modifie> afin d'éliminer les fichiers résiduels utilisés pendant la conversion (ne sera plus nécessaire dans la future version 1.1 de Mercurial):

hg clone <mon_depot_modifie> <mon_depot_final>

et voilà un dépôt tout propre prêt à être montré à la face du monde ! :)

Commentaires

#1

NiCoS, le 17 novembre 2008 à 23:10 :

Suite au convert, tu fais bien un hg add, hg commit, hg push ? Si je cherche à faire un push sur un dépot existant chez bitbucket ça me propose de faire un merge et me fait des choses étranges...

#2

Comète, le 18 novembre 2008 à 09:45 :

Salut,

non en fait le "hg convert" te crée un nouveau depôt propre en local, pas besoin de "hg add" ni "hg commit" dans ce nouveau dépôt ! Si c'est effectivement le cas (genre un "hg status" te renvoie des fichiers avec des ? devant), alors dans ce cas tu utilises une version buguée de Mercurial, la dernière version devrait corriger ce problème.
Sinon, une fois ton nouveau dépôt créé, tu supprimes celui sur Bitbucket et tu push le nouveau.
Voilà ! :)

#3

NiCoS, le 18 novembre 2008 à 11:50 :

Ce doit être la version de mercurial sous MacOS X qui a un souci alors, car ça me le fait systématiquement :-(

Merci de l'info en tous cas !

#4

Comète, le 18 novembre 2008 à 13:21 :

Au temps pour moi, j'avais oublié la dernière étape qui ne sera plus utile dans la version 1.1.
J'ai modifié le billet à ce sujet. Ca devrait marcher maintenant :)

#5

NiCoS, le 18 novembre 2008 à 16:53 :

ahhh ok :-)

Je teste ça ce soir !

#6

NiCoS, le 18 novembre 2008 à 22:37 :

Effectivement, ça marche mieux :-)

Poster un commentaire