Um eine Migration eines gesamten Repositories von Subversion nach Git durchzuführen, zeige ich hier die einzelnen Schritte auf.
Installation von Git
Git muss mit SVN Unterstuetzung installiert werden. Unter Ubuntu/Debian erledigt man das mit:
aptitude install git-core git-svn
Unter Mac OS X geht das mit Macports so:
sudo port install git-core +svn
Mit Fedora:
yum install git git-svn
Migration
Zuerst legen wir uns eine Mapping Datei names authors.txt an, mit der wir zu den SVN Benutzernamen den Namen und die Emailadresse zuweisen, welche mit Git verwendet werden soll.
alex = Alexus the 1. <me@mydomain.com>
steve = Steve Jobs <you@mydomain.com>
bill = Bill Gates <another@mydomain.com>
Um die Migration zu starten wechselt man in das Verzeichnis, in dem das Git Repository angelegt werden soll. Git wird ein Unterverzeichnis im aktuellen Verzeichnis mit dem gleichen Namen anlegen, wie das SVN Repository heißt:
git svn clone --stdlayout --no-metadata -A authors.txt mysvnrepo
–stdtlayout zeigt an, dass im SVN Repository trunk, tags und branches vorhanden sind. tags und branches werden als git branches übernommen. –no-metadata verhindert, dass keine SVN Informationen festgehalten werden (wie z.B. SVN Verweise in den Commit Meldungen)
Um die Ignore-Einstellungen aus dem alten SVN Repository zu übernehmen, verwendet man den nachfolgenden Code. (Dies funktioniert aber nur, wenn nicht –no-metadata verwendet wurde; man sollte sich also vorher überlegen, ob man lieber auf die Meta-Informationen verzichten will oder einen weitere Bezug zum SVN Repository beibehalten will).
git svn create-ignore
Nun macht es Sinn einige Tests anzustellen:
Ist die History vorhanden? (die wird immer vorhanden sein, aber es ist ein gutes Gefühl sie zu sehen ;)) Dazu ruft man “git log | more” auf und man bekommt die Liste mit den einzelnen Commits angezeigt. Sind die Namen der Autoren richtig zugeordnet?
Welche Branches sind vorhanden? Mit “git branch -a” bekommt man die Liste der vorhandenen Branches ausgeben. Da Subversion alle Subversion tags nun “Remote branches” sind, müssen tags nun manuell mit Git gesetzt werden.
Nach der Migration
Nach der Migration liegt das alte SVN Repository als lokales Git Repository vor. Will man nun das Repository z.B. auf den zentralen Team Firmenserver hochladen, geht man wie folgt vor:
git remote add origin git@mein-git-server.de:mein_projekt.git
git push origin master:refs/heads/master
Hat man bei der Migration das Mapping der Benutzernamen vergessen oder man will einfach den Benutzernamen oder eine Emailadresse von allen Commit Messages ändern, kann man das mit filter-branch machen:
git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_NAME" = "alex" ];
then
GIT_AUTHOR_NAME="Alexander Meindl";
GIT_AUTHOR_EMAIL="meine-email@domain.de";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD
Diese Anweisung ist mit Vorsicht zu verwenden, da dadurch auch alle Hash Keys verändert werden (nicht nur von den Commits, bei den der Name/Email geändert wurde).