Passer de SVN à Git en préservant son historique de commits

Subversion (SVN) a eu une belle carrière parmi les outils de versionning mais il est aujourd’hui largement supplanté par Git. Plus souple, plus rapide, plus puissant, nombreux sont les développeurs qui souhaitent migrer leurs dépôts vers Git. Mais il serait dommage de perdre l’historique de son projet, surtout quand celui-ci remonte sur plusieurs mois / années.

Le sujet a déjà largement été abordé sur différents blogs, forums et mailing-list mais je vais simplement compléter les étapes classiques par celles que j’ai dû ajouter pour pouvoir migrer mes propres dépôts SVN qui n’avaient pas tous une structure standard (pas de Trunk par exemple…).
Nous utiliserons la commande par défaut git-svn. Si besoin : sudo apt-get install git-svn

Quelques étapes indispensables (pour plus de détails, se rendre à cette adresse, ou à celle-ci) :

Récupérer les différents commiters sur son dépôt SVN

svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > commiters.txt

Il suffit ensuite de transformer chaque ligne du fichier généré vers quelque chose du genre :

obalais = Olivier Balais <obalais@server.com>

Cloner votre dépôt SVN

Ici on spécifie l’url de son dépôt SVN, le fichier à utiliser pour les logs de commit et un dossier dans lequel cloner le dépôt. L’option no-metadata supprime les notes que git-svn ajoute à chaque message de commit par défaut.

git svn clone URL_DEPOT --no-metadata -A commiters.txt --stdlayout ~/mon_depot

Certains de mes dépôts avaient une structure non standard. Par exemple, certains projets simples n’avaient tout simplement pas de trunk, branches et tags mais directement la structure du projet commitée à la racine du dépôt (oui c’est moche…). Pour se sortir de ce genre de galères on peut utiliser les options -T, -t et -b pour spécifier les URI des Trunk, Tag et Branches. Dans mon cas, j’ai utilisé la commande suivante :

git svn clone URL_DEPOT --no-metadata -T / -A authors.txt --stdlayout ~/mon_depot

Sur un projet, j’ai également souhaité récupérer tous les commits excepté le dernier. Pour cela, il suffit d’ajouter l’option -r initial_revision:final_revision. Exemple :

git svn clone URL_DEPOT --no-metadata -T / -r 1:99 -A authors.txt --stdlayout ~/mon_depot

Créer un dépôt vide pour y pusher le contenu de son ancien dépôt SVN

git init --bare ~/mon_projet.git
cd ~/mon_projet.git
git symbolic-ref HEAD refs/heads/trunk

Pusher le contenu en faisant :

cd ~/mon_depot
git remote add bare ~/mon_projet.git
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare

Il ne reste désormais plus qu’à renommer la branche trunk en master…

Renommer son trunk en master

cd ~/mon_projet.git
git branch -m trunk master

And you’re done!

Publié par Olivier Balais

Jeune ingénieur logiciel basé à Lyon (@overnetcity) passionné par les NTIC et le développement Web, je suis actuellement salarié chez Reputation VIP et effectue en parallèle des missions ponctuelles en temps que Freelance. Passionné depuis toujours par l'informatique et le développement, suite à une formation solide à l'INSA de Lyon, je me suis spécialisé dans la réalisation de bout en bout de projets web complexes.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *