Migrer un projet de Subversion (SVN) vers Git est une étape clé pour moderniser ses processus de développement. Git offre des avantages majeurs comme un modèle de branches plus flexible, un travail en mode déconnecté et de meilleures performances.
Ce guide détaille les étapes pour une migration propre et complète.
Prérequis
Assurez-vous que git
et son extension git-svn
sont installés sur votre système.
# Sur Debian/Ubuntu
sudo apt-get update && sudo apt-get install git-svn
Étape 1 : Préparer le mapping des auteurs
SVN n’enregistre que le nom d’utilisateur pour chaque commit. Git, lui, attend un nom complet et une adresse e-mail. Nous allons créer un fichier de correspondance.
Exécutez cette commande à la racine de votre projet SVN pour extraire la liste des auteurs :
svn log --quiet | grep -E "r[0-9]+ \| .* \|" | cut -d'|' -f2 | sed 's/ //g' | sort -u > users.txt
Ouvrez le fichier users.txt
et complétez-le pour qu’il respecte le format Nom d'Utilisateur SVN = Prénom Nom <email@example.com>
:
# Fichier users.txt
oxomichael = Michael Oxo <michael@example.com>
anotheruser = Another User <another@example.com>
Étape 2 : Cloner le dépôt SVN avec git-svn
Maintenant, nous allons cloner le dépôt SVN dans un nouveau dépôt Git local. Cette commande va chercher chaque révision SVN et la transformer en un commit Git, en utilisant le fichier users.txt
pour attribuer les auteurs correctement.
--stdlayout
: Indique que votre dépôt SVN a une structure standard (trunk
,branches
,tags
).--no-metadata
: Empêche d’ajouter les métadonnées SVN dans les messages de commit Git.--authors-file
: Spécifie le fichier de mapping des auteurs.
git svn clone --stdlayout --no-metadata --authors-file=users.txt http://[PATH_SVN_DU_PROJET] [NOM_DU_PROJET_LOCAL]
Cette opération peut être très longue pour les dépôts avec un historique important.
Étape 3 : Nettoyer et convertir les références
L’outil git-svn
crée des branches et des tags distants qui ne sont pas des branches et tags Git natifs. Nous devons les convertir.
Placez-vous dans le dossier du projet nouvellement créé (cd [NOM_DU_PROJET_LOCAL]
) et exécutez les commandes suivantes.
1. Convertir les branches distantes SVN en branches locales Git :
git for-each-ref refs/remotes/origin | grep -v 'trunk' | cut -d / -f 4- | while read branchname; do git branch "$branchname" "refs/remotes/origin/$branchname"; done
2. Convertir les tags SVN en tags Git :
git for-each-ref refs/remotes/origin/tags | cut -d / -f 5- | while read tagname; do git tag "$tagname" "refs/remotes/origin/tags/$tagname"; done
3. Renommer la branche trunk
en main
:
La branche trunk
de SVN est l’équivalent de la branche principale dans Git. Renommons-la main
pour suivre les conventions modernes.
git branch -m trunk main
Étape 4 : Lier le dépôt Git local à un dépôt distant
Il est temps de connecter votre dépôt local à un nouveau dépôt Git distant (sur GitHub, GitLab, etc.).
git remote add origin git@[PATH_GIT_DU_PROJET]
Étape 5 : Pousser le projet vers le nouveau dépôt Git
Envoyez tout votre historique, vos branches et vos tags vers le nouveau serveur Git.
# Pousser la branche principale et toutes les autres branches
git push origin --all
# Pousser tous les tags
git push origin --tags
Votre projet est maintenant entièrement migré sur Git ! Vous pouvez archiver le dépôt SVN.