Migrer un repository SVN vers GIT sous Windows avec SVN2GIT

Dans l’idée de migrer des vieux repos SVN vers GIT, j’ai utilisé par défaut l’outil fournit par GIT pour rapatrier un repo SVN entier en local et le pousser à la fin vers GIT.

Pour rapatrier le repo, c’est assez simple. Pour autant, dans le cas de très gros repo, j’alerte sur le fait que l’outil fournit directement par Git n’est pas fameux, et je donne dans le billet une autre méthode pour migrer, depuis Windows, de très gros et complexes repos.

Récupérer un repo et le pousser vers le master

cd workspace\svn2git\

git svn clone --stdlayout --authors-file=authors.txt http://my.svn.repo.url/svn/repo_name/ repo_name_php

OU, si l’on veut préciser le path de chaque dossier principal (peut être utile si vous n’avez pas un setup propre).

git svn clone --trunk=/trunk --tags=/tags --branches=/branches --authors-file=authors.txt http://my.svn.repo.url/svn/repo_name/ repo_name_php


Une fois que le rappatriement et la conversion ont été faits :

[sourcecode language="bash"]
cd repo_name_php

Vous pouvez ensuite, facultativement, re-récupérer (au cas où quelqu’un aurait commité quelque chose sur le repo pendant que vous faisiez votre récupération.

git svn fetch --authors-file=../authors.txt
git svn rebase

Puis, à la fin, vous affectez une remote origin à ce repo, puis vous poussez le master (le master sur Git correspond au trunk sur SVN) vers le repo distant.

git remote add origin ssh://git@my_account.bitbucket.com:7999/my_bitbucket_project/git_repo_name.git
git push -u origin master

Et si vous vous êtes trompé dans l’affectation de l’URL de l’origine, vous pouvez toujours la changer avec la commande suivante :

git remote set-url origin ssh://git@my_account.bitbucket.com:7999/my_bitbucket_project/git_repo_name.git

Cas particulier : vous ne voulez récupérer que ce qu’il y a après un certain commit

Disons que vous ne voulez récupérer que ce qui a suivi le commit n°240.

Une fois que vous êtes dans le dossier de votre repo local :

git svn clone -s -r240:HEAD http://my.svn.repo.url/svn/repo_name/ .

Après récupération : pousser une branche

git show-ref
cp -Rf .git/refs/remotes/origin/v1 .git/refs/heads/
git push --all origin

NB : il peut arriver que vos Remotes n’aient pas été converties en branches. Dans ce cas là, creez un script sh avec ce contenu :

for branch in `git branch -r | grep "branches/" | sed 's/ branches\///'`; do
  git branch $branch refs/remotes/$branch
done

Et exécutez-le depuis la racine de votre dossier de récupération.

Après récupération : pousser les tags

Créez un .sh, que vous nommerez par exemple push_all_tags.sh

Mettre dedans :

for tag in `git branch -r --sort=committerdate | grep "tags/" | sed 's/.*tags\///'`; do
  git fetch --tags # must fetch tags before pushing more
  git tag -a -m "Convert Subversion tag" $tag refs/remotes/origin/tags/$tag
  git push origin $tag
done

Mettre le .sh dans le dossier en local du repo
Puis exécuter dans un cmd :

workspace\svn2git\repo_namesvnrepo>sh push_all_tags.sh

NB : il peut arriver que vos Remotes n’aient pas été converties en tags. Dans ce cas là, creez un script sh avec ce contenu :

for tag in `git branch -r | grep "tags/" | sed 's/ tags\///'`; do
  git tag -a -m"Converting SVN tags" $tag refs/remotes/$tag
done

Et exécutez-le depuis la racine de votre dossier de récupération.

Les différentes erreurs que j’ai pu avoir

J’ai eu plusieurs erreur à la récupération (c’est à dire avant même d’avoir tout récupéré, l’outil ne voulait pas finir la récupération…). Apparemment ces erreurs sont dues à des limitation côté Perl (celui embarqué par l’outil).

Connection reset by peer: Error running context: Connection reset by peer at /mingw64/share/perl5/site_perl/Git/SVN/Ra.pm line 312.

J’ai réglé cette erreur en utilisant Smartgit.

Pareil :

Malformed network data: The XML response contains invalid XML: Malformed XML: no element found at /mingw64/share/perl5/site_perl/Git/SVN/Ra.pm line 312.

J’ai résolu également cette erreur en utilisant SmartGit.

Après récupération, j’ai eu aussi l’erreur
fatal: Failed to resolve ‘refs/remotes/my_branch_v1.7.3’ as a valid ref.

Encore une fois, l’outil fourni par Git est assez faible, Smartgit n’a eu aucun soucis à la récupération et à la conversion correcte des tags.

Laisser un commentaire

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

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