Utiliser git-svn pour interfacer Git avec un depot subversion

Même si Git est le système de gestion de version le plus utilisé, on a parfois la malchance de tomber sur de vieux projets qui utilisent encore subversion. Heureusement, Git propose git-svn, une interface qui permet de travailler sur un dépôt subversion grâce aux commandes Git.

La première étape, c'est bien entendu d'installer git-svn. Je vous laisse adapter la commande suivante à votre distrib :

sudo apt-get install git-svn

Créons un dépot git à partir du svn

git-svn clone http://svn.example.com/svn/projet -T trunk projet

Cette (longue) commande va créer un répertoire "projet", initialiser un dépot git, et y importer le trunk.

Si vous utilisez des svn:ignore, il est possible de les récupérer aussi

cd projet
git-svn show-ignore >> .git/info/exclude

Bon, nous voilà avec un dépot git et bonne et due forme. Bien entendu, vous pouvez utiliser toutes les fonctionalités de git normalement (git blame, git log, git stash_, git bisect, etc.)

Bon ! Passons aux dev (comme d'hab, on évite de toucher à la branche master) :

git checkout -b dev
# dev dev dev
git add ...
git commit
# dev dev dev
git add ...
git commit

Nous voici avec plusieurs commit, qu'on aimerait reporter sur le dépot svn. D'abord, un update :

git svn rebase

Git va récupérer les modifs du dépot subversion, et les appliquer au dépot local avec la méthode rebase, ce qui signifie qu'il va appliquer tous les changements du dépot AVANT vos modifications. L'avantage, c'est que vos commit se retrouveront en queue de l'arborescence.

# Avant git svn rebase
     E---F---G local:dev
    / <- clone
A---B---C---D svn

# Après git svn rebase
             E---F---G local:dev
            /
A---B---C---D svn

C'est clair ? Ok, maintenant, reste à comitter :

git svn dcommit
# dcommit, pas commit

                         local:dev
                        /
A---B---C---D---E---F---G svn

Git va reporter tous les commits, un par un, vers le dépot svn. Ensuite, il synchronise les dépots local et distant.

git checkout master
git svn rebase

Voilà, vous savez tout. Au besoin, consultez la doc de git-svn pour plus de détails. En attendant, bon WE à tous.