Ich habe letztes Jahr von Git-SVN berichtet – mit dieser Software lassen sich SVN-Repositorys ins Git konvertieren, wenn diese nicht zu aufwendig sind! Sobald jedoch eine kleine Schwierigkeit auftritt, hat es sich damit auch schon erledigt.
Nach kurzer Zeit bin ich auf die Software SVN-All-Fast-Export gestoßen, sie nennt sich nebenbei auch Svn2Git. Entwickelt wurde die Software von der KDE-Community, um die KDE-Entwicklung damals von SVN auf Git umzustellen. Und – nach einigen sehr umfangreichen und auch umständlichen SVN-Repos – es funktioniert prächtig.
Inhaltsverzeichnis
SVN-All-Fast-Export installieren
Unter auf Debian basierenden Linux-Distributionen installieren Sie diese Software wie üblich über die Paket-Verwaltung durch das Paket „svn-all-fast-export„.
SVN-All-Fast-Export nutzen
Grundsätzlich – es ist einfach, auch aufwendige SVN-Repos ins Git zu verschieben, es kostet hin und wieder aber auch Zeit. SVN-All-Fast-Export aberbeitet jedoch um einiges schneller, als Git-SVN – um vieles schneller sogar.
Grundsätzlich benötigen Sie einmal alle Autoren, die im SVN-Repo gearbeitet haben, hierzu clonen Sie sich das Repo am einfachsten auf den lokalen Rechner – also etwa:
svn co https://server.org/svn-repo/
Sie wechseln auf dem Terminal ins geklonte Verzeichnis und holen sich die Autoren mit folgendem Befehl:
svn log --xml --quiet | grep author | sort -u | perl -pe 's/.*>(.*?)<.*/$1 = /'
Je nach Größe des Repos kann dies auch einige Minuten dauern – Sie erhalten eine Liste mit Benutzern, ein Beispiel:
user =
user1 =
user2 =
Sie kopieren sich diese Liste und fügen diese in eine Textdatei ein, diese nenne ich jetzt beispielsweise „authors.txt„. Hier geben Sie den Benutzern eine Git-Verträgliche Namensnennung – beispielsweise:
user = Benutzer Eins <mail-adresse@.org
user1 = Benutzer Zwei <mail-adresse1@org
user2 = Benutzer Drei ...
(no author) = no_author <no_author@no_author>
Die letzte Zeile hilft dabei, wenn ein Autor nicht ermittelt werden konnte. Anschließend benennen Sie das Verzeichnis mit dem Repo um – Sie benötigen es noch für die Verzeichnis-Struktur des Repos.
Jetzt benötigen Sie noch das Original-Verzeichnis des Repos, so wie es auf dem Server liegt – also nicht das eigentliche geklonte Repo, sondern das Verzeichnis mit der Konfiguration des Repos. Ich habe mir dieses meist einfach mit scp auf den lokalen Rechner kopiert – also etwa:
scp -r root@server.org:/svn/repo-verzeichnis/ /home/robert/svn2git/
Im Beispiel habe ich jetzt im Verzeichnis „svn2git“ das umbenannte, geklonte Repo „repo-umbenannt„, das kopierte Repo-Verzeichnis „repo“ und die Datei „authors.txt„. Der Übersicht halber, lege ich jetzt noch ein Verzeichnis namens „git“ an – in diesem soll anschließend das konvertierte Git-Repo liegen.
Was wir jetzt noch benötigen, sind die Regeln, mit denen Svn2Git arbeiten soll. Die Dateiendung dafür nennt sich „.rules„, die Textdatei nenne ich jetzt einfach „repo.rules„. In dieser Textdatei beginnen wir damit, die Git-Repo-Namen anzulegen – im Beispiel ist im SVN-Repo nur ein Repo vorhanden, das Repo nenne ich „git-repo„:
create repository git-repo
end repository
Sind mehrere SVN-Repos darin vorhanden:
create repository git-repo
end repository
create repository zweites-repo
end repository
...
Im nächsten Abschnitt geben Sie an, was mit den Verzeichnissen im SVN-Repo geschehen soll – ein sehr einfaches SVN-Repo hat folgende Unterverzeichnisse:
| trunk | Aktuelle Dateien |
| tags | Tags |
| branches | Branches |
Je nach Repo können Tags und Branches auch wegfallen, auch können sich diese etwas anders nennen, wie es eben erstellt und genutzt wurde. Was mit den Verzeichnissen geschehen soll, geben Sie mit match an:
match /trunk/
repository git-repo
branch master
end match
Sie geben nicht das Verzeichnis des Repos an, sondern Sie beginnen ab den Unterverzeichnissen. Jetzt gehen Sie weiter mit den vorhandenen Verzeichnissen, um etwa alle Tags und Branches zu übernehmen:
match /tags/([^/]+)/
repository git-repo
branch refs/tags/\1
substitute branch s/ /_/
end match
match /branches/([^/]+)/
repository git-repo
branch refs/tags/\1
substitute branch s/ /_/
end match
Einzelne weitere Verzeichnisse, die im Repo liegen, geben Sie als eigene Repos an – also etwa:
match /anderes_Verzeichnis/
repository zweites-repo
branch master
end match
Möchten Sie Verzeichnisse ausschließen, geben Sie diese wie folgt an:
match /auszuschließendes-Verzeichnis/
end match
Oder wollen Sie alle nicht angegebenen Verzeichnisse ausschließen:
match /
end match
Manche schwindligen Repos enthalten auch einzelne Dateien, mit solchen gehen Sie ebenso vor. Hin und wieder kann die Software nicht weitermachen, weil Verzeichnisse ausgeschlossen wurden – mit solchen wurden aber vielleicht Tags oder Branches angelegt. In solchen Fällen schließen Sie diese nicht aus, sondern legen ein extra-Repo an und konvertieren diese einfach in ein solches – Svn2Git holt sich diese dann, wie sie gebraucht werden.
Haben Sie die Regeln erstellt, wechseln Sie in das neu angelegte Verzeichnis – ich habe es, wie oben beschrieben „git“ genannt. Dort wird die Konvertierung auf dem Terminal gestartet (nach dem Beispiel oben):
svn-all-fast-export --identity-map=../authors.txt --rules=../repo.rules --stats --add-metadata /home/robert/svn2git/repo/
Mit --identity-map= geben Sie die Autoren-Datei an, mit --rules= die Regel-Datei. Zuletzt folgt das vom Server kopierte Verzeichnis, nicht das geklonte. Sie können auch Revisionen ausschließen – dies gelingt mit der Textdatei „rev.txt“ im Verzeichnis mit den Regeln – hier geben Sie an, welche Revisionen konvertiert werden sollen,ein Beispiel:
0-10
12-200
210-230
Im Befehl geben Sie diese wie folgt an:
--revisions-file=../rev.txt
Die Software beginnt zu konvertieren und lässt Sie mitsehen, was gerade geschieht, zeigt am Ende das Log. Zuletzt zeigt die Software alle von Ihnen angegebenen Verzeichnisse – dahinter eine Zahl mit den Treffern. Ist hier eine Zahl bei Null, konnte die Software damit nichts anfangen und Sie haben eine fehlerhafte oder keine Konvertierung. Scollen Sie über die Verzeichnisse – dort finden Sie in den letzten zwei Zeilen die Fehlermeldung, meist handelt es sich um nicht angegebene Verzeichnisse, weil diese etwa gelöscht oder umbenannt wurden. Geben Sie an, was damit geschehen soll und starten erneut, bis Sie keine Fehlermeldungen mehr vorfinden. Im Verzeichnis, in dem Sie den Befehl gestartet haben, finden Sie anschließend die Verzeichnisse mit den erstellten Git-Repos.
In diese Verzeichnisse können Sie nun wechseln und schon einmal testen:
git log
git tag
git branch
Erhalten Sie eine Fehlermeldung, sehen Sie sich wieder die Logs an, Sie haben vergessen eines oder mehrere Verzeichnisse anzugeben.
Ist die Konvertierung gelungen – und dies tut sie irgendwann, legen Sie im Git die neues Repos an und schupfen die einzelnen Repos, deren Tags und Branches ins Git. Sie haben dann dort die komplette History, die Tags und Branches.
Wichtig vor allem – SVN erlaubt auch etwa einen Trunk unter einem Trunk – Git tut dies nicht, einen Trunk unter einem Trunk, müssen Sie als eigenes Git-Repo konvertieren.
Svn2Git funktioniert perfekt und mehr als doppelt so schnell, wie Git-SVN.

Noch keine Reaktion