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!