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éressegit config ... (facultatif) va indiquer à ce projet hybride la correspondance utilisateurs svn vers git pour le projetgit svn fetchva réaliser un checkout du projet subversion en le transformant en matière assimilable par gitgit filter-branch --msg-filter ...va enlever des affichages disgracieux concernant subversion dans les messages de commitgit clone mon_projet_svn2git mon_projet_gitva 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 originva supprimer la référence d’origine sur le dossiermon_projet_svn2git(j’ai bien galéré 10 minutes avant de comprendre pourquoi legit pushme disait qu’il n’y avait rien à faire avant d’exécuter cette commande…)git remote add origin ...rattache le contenu du dossiermon_projet_gitau référentiel git sur le serveurgit push -u origin masterva 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.
interessant… Va falloir que je regarde GIT de plus près !
Merci ctacat