Avec SVN ou autre, bien élevé, l’Homo Sapiens Codeur gère sa production de logiciel dans un « SCM » (gestionnaire de code source) qui va lui permettre d’organiser le moins salement possible ses différentes versions de prose code-sourcitisque. #novlangue
De génération en génération, bien élevé que j’espère avoir été, j’ai donc sué avec:
- des outils libres: vénérable RCS (à l’école!), CVS, Subversion (alias SVN),
- et propriétaires: PVCS, ClearCase, MS-VSS,…
Ils sont aujourd’hui tous passés de mode (ça ne nous rajeunit pas), même SVN. La mode du moment est plutôt de travailler sur du Mercurial ou l’inévitable GIT (via l’opérateur-ogre de la plate-forme github.com notamment).
Mes projets de +8 ans d’âge (pas si vieux) et surtout toujours actifs/maintenus se trouvent encore sur SVN. Et depuis que j’ai goûté à GitLab, j’ai fort fort envie d’en faire profiter ces projets-là… #MigrationEnVue
Pré-requis et svn2git
Dans le désordre: Subversion, Git, Ruby (et RubyGems, mais sur Ubuntu tout roule).
sudo apt-get install git-core git-svn ruby sudo gem update --system sudo gem install svn2git
Ce n’est pas plus complexe que cela.
Extraction des données SVN
Donc dans un répertoire nouveau (dans ce billet, l’exemple est pris sur la migration de LiberSign), une longue commande extrait la liste des contributeurs au projet hébergé sur le dépôt SVN:
mkdir libersign-git-repo cd libersign-git-repo/ svn log --quiet svn+ssh://svast@scm.adullact.net/svn/libersign/trunk | grep -E "r[0-9]+ \| .+ \|" | cut -d'|' -f2 | sed 's/^ //' | sort | uniq > ~/authors.txt
Ensuite, on édite le fichier, avec par exemple vi ~/authors.txt
. L’idée est de reprendre ces contributeurs avec leur identité « username » et de la compléter pour avoir un résultat qui ressemble à:
jdoe = John Doe <j.doe@ghost-company.com> t.stark = Tony Stark <ts@acme.net>
Maintenant que les préparatifs sont achevés, la ligne magique svn2git
:
svn2git svn+ssh://svast@scm.adullact.net/svn/libersign --authors ~/authors.txt
Bon, ça prend du temps (un peu moins d’une heure chez moi avec un entrepôt modeste, ça dépend évidemment de la taille de l’entrepôt). ET noter que ça a bien marché parce que j’ai bien les 3 répertoires branches/tags/trunk à la racine de ce SVN… Sinon, c’est plus compliqué.
Merci aux internets:
- Blog: https://www.getdonedone.com/converting-5-year-old-repository-subversion-git/
- ainsi que: http://wodric.com/migration-svn-git/
- L’outil svn2git: https://github.com/nirvdrum/svn2git
Du Git local vers Gitlab
Zou, bientôt fini, changer la cible pour lier le dépôt local au dépôt distant et pousser le tout (master, branches, tags):
git remote add origin <gitlab-repo-url> git push -u origin --all git push --tags
Et voilà ! De retour sur le Gitlab en navigateur, on constate que tout a été récupéré, y compris les tags. Les graphes montrent aussi que les dates de commit sont conservées:
Mission accomplie pour celui-là, projet suivant ! J’adore quand un plan se déroule sans accroc… 🙂