mai 01
Modifier le contenu d'une révision dans un référentiel Subversion
Il peut parfois être utile de devoir modifier le contenu d'une révision dans un référentiel Subversion pour supprimer une information qui n'aurait jamais dû s'y trouver comme, par exemple, un mot de passe.
Logiciels utilisés :
- Subversion 1.4.2
- GNU Bash 3.1.17
- GNU Sed 4.1.5
Commençons par créer un référentiel de test nommé « modification_revision » :
root@gnusquad:~# REPOS=/var/local/lib/svn/modification_revision root@gnusquad:~# svnadmin create $REPOS
Effectuons une copie locale (checkout) de ce référentiel :
root@gnusquad:~# svn co file://$REPOS Révision 0 extraite.
Ajoutons-y un fichier « exemple » et commitons le dans le référentiel :
root@gnusquad:~# cd modification_revision/ root@gnusquad:~/modification_revision# echo mon_password : gruikgruik > exemple root@gnusquad:~/modification_revision# svn add exemple A exemple root@gnusquad:~/modification_revision# svn ci -m "ajout d'un fichier" Ajout exemple Transmission des données . Révision 1 propagée.
Le but, maintenant, est de faire disparaître le mot de passe « gruikgruik » du référentiel afin que personne ne puisse le récupérer.
Commençons par effectuer un dump du référentiel dans le fichier ~/dump_svn :
root@gnusquad:~/modification_revision# cd root@gnusquad:~# svnadmin dump $REPOS > dump_svn * Révision 0 déchargée. * Révision 1 déchargée.
Modifions le mot de passe dans le dump avec sed par exemple en veillant à mettre le même nombre de caractères sinon vous obtiendrez l'erreur suivante par la suite : « svnadmin: Fin prématurée des données dans le flux de sauvegarde » à cause du Content-length de la révision :
root@gnusquad:~# sed -i s/gruikgruik/xxxxxxxxxx/g dump_svn
Supprimons le référentiel et recréons en un vide :
root@gnusquad:~# rm -r $REPOS root@gnusquad:~# svnadmin create $REPOS
Importons le dump :
root@gnusquad:~# svnadmin load $REPOS < dump_svn
<<< Début d'une nouvelle transaction basée sur la révision 1
* ajout de : exemple ...
svnadmin: Sommes de contrôle différentes, fichier '/exemple' :
attendu : 6fe4a181ffeec4b6da1b63d377f14fb4
obtenu : def10992a3cb890493d37440f3538fd8
Subversion nous informe que les sommes de contrôle sont différentes ce qui est tout à fait normal vu que l'on a modifié le mot de passe, mettons donc à jour celles-ci :
root@gnusquad:~# sed -i s/6fe4a181ffeec4b6da1b63d377f14fb4/def10992a3cb890493d37440f3538fd8/ dump_svn
Puis pour en finir, réimportons proprement le dump :
root@gnusquad:~# rm -rf $REPOS
root@gnusquad:~# svnadmin create $REPOS
root@gnusquad:~# svnadmin load $REPOS < dump_svn
<<< Début d'une nouvelle transaction basée sur la révision 1
* ajout de : exemple ... fait.
------- Révision 1 propagée (commit) >>>
Et voilà, notre référentiel ne contient plus de traces du mot de passe « gruikgruik ».

Le 6 mai 2008 à 19:00
[...] Notez que vous pouvez très bien les utiliser en tant qu’arguments (exemple sur le billet « Modifier le contenu d’une révision dans un référentiel Subversion ») [...]