Migrer un référentiel Subversion vers GIT en conservant les messages de commit…

J’ai décidé de passer de subversion vers git. Pourquoi ? Parce que. Au-delà de cette décision purement arbitraire et dictatoriale, c’est la bonne occasion d’apprendre à utiliser git sérieusement (parce que je suis curieux).

Je ne parlerai pas de l’installation/configuration de git et autres gitosis/gitolite, il y a plein de docs sur le Net qui expliquent très bien comment on fait (c’est pas compliqué, même s’il faut connaître un minimum SSH). Gitosis et Gitolite sont des outils qui permettent de gérer de façon privé des dépôts comme GitHub. J’ai personnellement choisi gitolite qui semble plus actif que gitosis.

Dans ma situation, où j’ai changé pas mal de chose un peu à l’arrache ces derniers temps, je dispose des référentiels Subversion sous forme de fichiers, mais plus de la possibilité d’utiliser Apache pour y accéder (je suis en train de virer Apache au profit de Nginx sur un Netbook, restreint en ressources par définition, Apache étant trop gourmand pour la plupart de mes besoins). Je peux donc accéder aux référentiels uniquement par le démon svnserve, qui est donc démarré pour l’instant sur le réseau.

Pour migrer un référentiel subversion vers git, il faut au préalable avoir créé le référentiel git (ou le projet en terminologie gitosis/gitolite).

Ensuite, on peut créer un fichier qui va contenir une correspondance entre les utilisateurs qui ont comités dans Subversion en utilisateurs git. Ce fichier aura la forme suivante :

ctacat = Vincent Planchenault <[email protected]>
...

A partir de là, la succession des commandes à réaliser est :

$ mkdir mon_projet_svn2git
$ cd mon_projet_svn2git
$ git svn init svn://<serveur subversion>/<mon projet>/trunk/
[ $ git config svn.authorsfile <chemin vers le fichier de correspondance> ]
$ git svn fetch
$ git filter-branch --msg-filter 'sed -e "/git-svn-id:/d"'
$ cd ..
$ mkdir mon_projet_git
$ git clone mon_projet_svn2git mon_projet_git

Quelques explications :

  • git svn init ... va initialiser le dossier comme un projet "hybride" svn et git; ici je me limite au dossier trunk, mais vous pouvez bien sûr choisir le dossier de base qui vous intéresse
  • git config ... (facultatif) va indiquer à ce projet hybride la correspondance utilisateurs svn vers git pour le projet
  • git svn fetch va réaliser un checkout du projet subversion en le transformant en matière assimilable par git
  • git filter-branch --msg-filter ... va enlever des affichages disgracieux concernant subversion dans les messages de commit
  • git clone mon_projet_svn2git mon_projet_git va réaliser un checkout pur git de ce qui vient d'être fait, finissant de virer les spécificités subversion

Il ne reste plus qu'à "pousser" ce nouveau référentiel git vers le serveur, de la façon suivante :

$ cd <mon_projet_git>
$ git remote rm origin
$ git remote add origin git@<serveur git>:/<mon projet>.git
$ git push -u origin master

Quelques explications :

  • git remote rm origin va supprimer la référence d’origine sur le dossier mon_projet_svn2git (j’ai bien galéré 10 minutes avant de comprendre pourquoi le git push me disait qu’il n’y avait rien à faire avant d’exécuter cette commande…)
  • git remote add origin ... rattache le contenu du dossier mon_projet_git au référentiel git sur le serveur
  • git push -u origin master va committer ce qui vient d’être migré de subversion vers le référentiel git

Je suis maintenant capable de faire un git clone git@<serveur git>:/<mon projet>.git pour en faire une copie où j’en ai besoin, et je n’ai plus besoin d’utiliser subversion pour ce projet en particulier. Il reste à faire cela pour tous les autres projets, et je pourrai alors arrêter le démon svnserve et faire un peu de ménage.

This entry was posted in Développement, Technologie and tagged , . Bookmark the permalink.

One Response to Migrer un référentiel Subversion vers GIT en conservant les messages de commit…

  1. rokdun says:

    interessant… Va falloir que je regarde GIT de plus près !
    Merci ctacat :-)

Laisser un commentaire