Migrer son code de SVN vers Git

Logo GIT
Logo GIT

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:

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:

libersign-graph-gitlab

Mission accomplie pour celui-là, projet suivant ! J’adore quand un plan se déroule sans accroc… 🙂

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.