Migrer un projet de SVN vers GIT en 3 étapes

Après avoir lu cet article n’hésitez pas à jeter un œil sur l’article décrivant un exemple de workflow de dev local.

J’ai récemment étudié la possibilité de passer de SVN à Git, il ne m’a pas fallu longtemps pour convaincre tous le monde dans l’entreprise d’utiliser GIT grâce sa rapidité et sa gestion décentralisée. Cette article va décrire la démarche utilisée pour migrer nos dépôts SVN vers Git. Je ne décrirai pas l’installation du serveur git, selon votre cas, vous opterez une installation serveur ou une solution hébergé en fonction de vos besoins. Quelques exemples de serveur Git :  Gitolite, Gitlab (Installé ou hébergé) ou le plus connu Github.

A noter, que Github dispose de son propre importeur de projet SVN.

Cette article est une traduction de la solution que propose Atlassian sur son site. J’en propose ici une version simplifiée. Si vous souhaitez approfondir vous pouvez consulter l’article original et/ou poser vos questions dans les commentaires.

Pré-requis

Pour pouvoir migrer vos projets de SVN vers Git en utilisant la méthode qui suit, il vous faut :

  • Java 6+
  • Git
  • Un dépôt git pour chacun de vos projets à migrer.
  • Subversion
  • Télécharger le script de migration svn-migration-scripts.jar, pour la suite mettez le à la racine de votre utilisateur courant

Pour vérifier que vous avez les pré-requis:

java -jar ~/svn-migration-scripts.jar verify

NB : Ce tutoriel est valable pour Linux et Mac Os X, je n’ai pas essayé sous Windows à priori les commandes Java et les commandes Git restent les même.

Etape 0 : Sous Mac Os X, montage requis d’une image disque sensible à la casse

Cette migration doit être effectuée sur un système de fichier sensible à la casse. Malheureusement le système de fichier par défaut de Mac Os X n’est pas sensible à la casse. Il faut donc dans ce cas, créer une image de système sensible pour la migration. Pour cela, faire les manipulations suivantes:

cd ~/ 
java -jar ~/svn-migration-scripts.jar create-disk-image 5 GitMigration

La valeur « 5 » correspond à la taille en Go de l’image créée, il est nécessaire de l’adapter en fonction de votre projet.

La valeur « GitMigration » est le nom de l’image créée.

Etape 1 : Récupération des informations auteurs

La première étape est de récupérer les informations des auteurs depuis votre dépôts SVN. Pour cela nous utiliserons le script Java à notre disposition :

# Si vous êtes sous Linux, créé
cd ~/GitMigration 
java -jar ~/svn-migration-scripts.jar authors <svn-repo-url> > authors.txt

Il faut remplacer <svn-repo-url> par l’URL du dépôt SVN à migrer, afin de récupérer la liste de tous les auteurs intervenus sur ce dernier. La liste des auteurs est écrite dans le fichier authors.txt.

Cette étape peut prendre quelques minutes si votre dépôt SVN dispose de beaucoup de révisions. A titre indicatif, cela a pris entre 1 et 2 minutes pour un dépôt avec moins de 30 000 révisions.

Il est nécessaire de modifier les informations dans le fichier authors.txt pour les compléter. En effet,  SVN ne permet pas de récupérer toutes les informations que GIT utilise à propos des auteurs. Vous aurez donc en sorti un fichier formaté de la manière suivante :

j.doe = j.doe <j.doe@mycompany.com> 
m.smith = m.smith <m.smith@mycompany.com>

Remplacez les emails et les noms si nécessaire. Par exemple :

j.doe = John Doe <john.doe@atlassian.com>
m.smith = Mary Smith <mary.smith@atlassian.com>

Etape 2 : Migrer votre projet SVN en projet Git

Cette étape consiste à récupérer votre dépôt SVN et construire l’index Git à partir de ce dernier.

La première commande dépend de la structure de votre SVN. Ci dessous une image qui représente un dépôt SVN standard et un exemple de dépôt non-standard.

SVN standard et non standard

Si votre dépôt SVN respecte le schéma standard, il faut exécuter la commande suivante :

git svn clone --stdlayout --authors-file=authors.txt <svn-repo-url>/<project> <git-repo-name>

Avec « <svn-repo-url>/<project> » qui représente l’URL de votre projet dans votre dépôt SVN et « <git-repo-name> » le nom donné au dépôt git créé.

Si votre dépôt SVN ne respecte pas le schéma standard, il faut alors paramétrer les répertoires correspondant aux branches, tags et trunk. Dans mon exemple cela donne :

git svn clone --trunk=/trunk --branches=/branches --branches=/bugfixes --tags=/tags --authors-file=authors.txt <svn-repo>/<project> <git-repo-name>

Cette étape peut être longue. Pour un projet volumineux (plus d’un giga) et quelques 30 000 commits cette étape à pris plusieurs heures.

Quand les manipulations précédentes sont terminées vous pouvez faire les commandes suivantes :

git branch
git tag
git branch -r

Elles ne retourneront que le master (équivalent du trunk svn), mais pas vos anciens branches/tags SVN. Il faut quelques commandes supplémentaires pour rapatrier les branches/tags en locale:

cd ~/GitMigration/<git-repo-name>
java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar clean-git
java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar clean-git  --force

La seconde commandes permet de lister les opérations que va réaliser la troisième pour rapatrier les branches. Suite à ces commandes, « git branch » et « git tag » affichent respectivement l’ensemble de vos branches/tags SVN.

Etape 3 : Partager votre projet sur le dépôt Git

Le projet est migré, mais il n’est pas encore partager avec votre dépôt GIT. Les lignes de commandes qui suivent permettent de lier le dépôt Git local à votre dépôt distant, puis push le master, les branches et les tags.

git remote add origin <git-repo-url>
git push -u origin --all
git push --tags

Structure de SVNIl faut vérifier que le projet est bien à jour, ce qui ne sera probablement pas le cas si les développeurs continuent de travailler sur le dépôt SVN en parallèle :

git svn fetch
java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar sync-rebase
java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar clean-git  --force
git push -u origin --all
git push --tags

Git ne fonctionne pas comme SVN, il distingue le téléchargement des commits et l’intégration des modifications dans le projet.  Le « git svn fetch » récupère les commits, les deux étapes suivantes importent les sources dans les différentes branches/tags et finit par envoyer les modifications sur le dépôt git distant.

Et voilà ! Votre dépôt Git est synchronisé sur la dernière version de votre dépôt SVN. Vous pouvez continuer vos développements en utilisant Git ou SVN. Si vous continuez pendant un moment sur SVN, il faudra rejouer le dernier lot de commandes pour remettre à jour Git.

Je pense continuer à traiter ce sujet avec au moins un article supplémentaire. N’hésitez pas à partager certains tips & tricks de votre utilisation Git. Certains apparaitront très probablement l’article à venir.

 

Merci Amaury et Mathieu pour vos relectures !

Source:

  • https://www.atlassian.com/git/tutorials/svn-to-git-prepping-your-team-migration

Partager l'article :

Facebooktwittergoogle_plusredditlinkedinmail
 

2 commentaires

  1. Ping : Git: Workflow de dev

  2. Ping : Les commandes Git : De bonnes bases (1/3)

Vous aussi participez, laissez un commentaire