Wie Du ein Subversion Repository (SVN) nach Git konvertierst

In diesem Howto beschreiben ich, wie ein existierendes Projekt aus einem Apache Subversion (SVN) Repository in ein Git Repository konvertiert werden kann.

Diesen kann mit Hilfe der bidirektionalen Subversion Brücke git-svn von Git erreicht werden.

Dieses führe ich mit dem Projekt test-spring-simple aus dem Beitrag Spring an einem einfachem Beispiel der Tutorial Serie Einführung in das Spring Framework vor.


Einige Informationen zu Git habe ich im Kapitel Wissenswertes zu Git des Beitrag Git mit GitHub schon einmal beschrieben.

Die Installation der bidirektionalen Subversion Brücke git-svn

Die bidirektionale Unterstützung von Subversion muss für Git gesondert installiert werden.

Die Vorbereitung der Benutzerkennungen

Dazu muss die Datei authors.txt erstellt werden. In dieser Datei werden die abgekürzten Namen der Subversion Benutzer auf den kompletten Namen der Git Benutzer zugeordnet.

Dadurch werden die Benutzer in der Historie richtig im Git-Style (Name des Benutzers und Email) angezeigt.

Zusätzlich sollte noch zwei Einträge für Commits ohne Namen ( no author) hinzugefügt werden. Leider benötigt Subversion die Eigenschaft svn:author nicht zwingend. Unterumständen kann dieser Name auch noch in der deutschen Übersetzung vorkommen.

Die Datei authors.txt kann auch mit Hilfe des folgenden Scripts direkt aus Subversion erstellt werden.

Danach muss die Datei noch bearbeitet werden. Es müssen die korrekten E-Mail-Adressen und ggfs. die Namen der Committer ersetzt werden.

Das Initialisieren des lokalen Repositories

Zunächst muss ein lokales Git Repository angelegt und initialisiert werden.

Die erste Alternativen legt ein Verzeichnis an, initialisiert es und holt die Daten aus dem Subversion Repository.

Die zweite Alternative erledigt alles in einem Schritt.

Mit der Option -rRevision:HEAD  kann die SVN-Revision angegeben werden, ab der die Daten aus dem SVN Repository ausgelesen werden. Dadurch kann das neue Repository entsprechend verkleinert werden.

Das Konvertieren der Eigenschaft svn:ignore nach .gitignore

In diesem Schritt wird die SVN-Eigenschaft svn:ignore in die Datei .gitignore konvertiert.

Das Konvertieren der SVN-Tag-Branches in richtige Git-Tags

Die Tags aus Subversion wurden beim Importieren nach Git in Branches tags/<name> umgewandelt.

Der Branch tags/2.0.1 wird gelöscht, da er mit dem Branch tags/v2.0.1 identisch ist.

Nun werden die Tags mit den folgenden zwei Befehle konvertiert.

Im folgenden Beispiel werden die beiden Tags v1.0 und v1.0.1 konvertiert.

Für die Konvertierung aller Tags in einem Schritt kann folgende Befehlskette verwendet werden.

Nach dem Konvertieren aller Tags stellt sich folgendes Bild dar.

Das Entfernen von SVN-Branches mit einer Revisionsnummer im Namen

Manchmal entstehen durch die Konvertierung mit der Subversion Brücke git-svn Branches in der Form Name@Revision.

Mit dieser Befehlskette können diese Branche entfernt werden.

Das Konvertieren der SVN-Branches in lokale Branches

Zunächst wird der Branch trunk gelöscht, da er im Branch master enthalten ist.

Der verbleibende entfernte Branch b1.0 muss nun noch als Upstream gekennzeichnet und danach gelöscht werden. Der Branch wird gelöscht, da er noch eine Verbindung zum SVN darstellt und diese gekappt werden soll. Im Repository bleiben die Metadaten durch das Löschen unverändert.

Auch hier bieten sich zwei Alternativen an.

Das Hochladen des Repositories nach GitHub

Um ein Repository bei GitHub zu erzeugen, siehe im Beitrag Git mit GitHub. Dabei sollte das Repository nicht mit einer README.md oder .gitignore initialisiert werden, da dieses die Historie des Repositories verändert. Dieses sollte in einem weiteren Schritt nachgeholt werden.

Das konvertierte Projekt bei GitHub:
Repository bei GitHub

Die Historie bzw. der Network Graph nach dem Import:

Der Git Network Graph des Projektes "test-spring-simple"

Der Network Graph des Projektes 'test-spring-simple' (© Frank Rahn)

Die Literaturempfehlungen

Update am 25.09.2012

Das Konvertieren der SVN-Tag & Branches in Git Tags & Branches

Die folgenden Kommandozeilenbefehle stellen eine andere Art dar, die Subversion-spezifischen Branches und Tags nach Git zu konvertieren.

Allerdings bevorzuge ich die Konvertierung über die Git Befehle, da diese auch die Datei .git/config verändern.

Update am 08.01.2017

Es wurden einige neu Erkenntnisse in den Beitrag eingearbeitet.

Frank Rahn

Frank Rahn ist Softwarearchitekt. Er unterstützt bei der Konzeption von Softwarearchitekturen mit Java-Technologie. Folge Sie ihm auf Facebook, Twitter oder Google+.

Benötigen Sie Unterstützung? Kontaktieren Sie ihn.

Hat Ihnen dieser Beitrag gefallen? Wir würden uns über Ihren Kommentar freuen! Bitte verwenden Sie Ihren bürgerlichen Namen und eine E-Mail-Adresse mit Gravatar.

Letzte Artikel von Frank Rahn (Alle anzeigen)

0 Kommentare

Dein Kommentar

Want to join the discussion?
Feel free to contribute!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.