Git und Subversion gemeinsam nutzen

Bereits von Haus aus unterstützt Git eine durchaus effektive Zusammenarbeit mit SVN. Das System bietet zahlreiche Funktionen, um eine lokale Kopie eines SVN-Repositoriums zu erstellen, lokal unter Git zu arbeiten und die Änderungen wieder in SVN zu integrieren. Diese Beschreibung stellt diese Lösung kurz vor.

Git gehört zweifelsohne zu den Shooting-Stars der Versionsverwaltungssysteme der letzten Jahre. Das ursprünglich für die Verwaltung der Kernel-Entwicklung erstellte System bietet zahlreiche Vorteile, weshalb es vor allem für die Entwicklung von großen Projekten bevorzugt wird. Doch wer glaubt, dass Git alle Belange der Entwicklung abdecken kann, der irrt. Eine globale Aussage in Stile von »Git ist besser als XY« ist schlicht nicht möglich, wenn kein klares Arbeitsumfeld bestimmt werden kann. Denn Git bietet zahlreiche Vorteile in dem Aufgabenbereich, für den es konzipiert wurde. In anderen Bereichen, wie einer zentralen Verwaltung, hat das System dagegen diverse Schwächen. Was liegt also näher, als die Vorteile von SVN und Git zu vereinen und beide Systeme gleichzeitig zu nutzen?

Git bietet bereits von Haus aus zahlreiche Werkzeuge, um mit SVN-Repositorien zu interagieren. Zuständig für die Kommunikation zwischen Subversion und Git ist das Paket »git-svn«, das in der Konsole als »git svn« aufgerufen wird. Das Tool versteht das »Standardlayout« (trunk/branches/tags), weshalb es nicht nur mit dem Trunk, sondern auch mit Branches oder Tags klar kommt. Um ein bestehendes Projekt lokal zu speichern, müssen folgende Schritte durchgeführt werden:

# mkdir PROJEKTNAME # cd PROJEKTNAME && git svn init SVN_REPOSITORY # git svn fetch

Dabei wird das komplette Projekt heruntergeladen, weshalb der initiale Lauf vor allem bei größeren Projekten durchaus eine Weile dauern kann. Alternativ kann das SVN-Verzeichnis auch mit »svn clone« lokal gespeichert werden, das eine Summe der obigen Kommandos darstellt. Wer ein Standardlayout einsetzt, kann zudem dem clone-Befehl »--stdlayout« oder »-s« übergeben:

# git svn clone --stdlayout SVN_REPOSITORY

Will man eine bestimmte Revision eines Projekts herunterladen, kann man das mit dem Parameter »-r« erledigen.

# git svn clone --stdlayout -rVERSION SVN_REPOSITORY

Ist es Projekt auf dem lokalen System gespeichert, kann es mit dem Kommando »git svn fetch« oder »git svn rebase« aktualisiert werden. Zu beachten ist allerdings, dass rebase das Projekt auf den neuesten Stand des HEAD bringt.

Fortan können Änderungen wie gewohnt unter der Ägide von Git durchgeführt und die von Git zur Verfügung stehenden Werkzeuge genutzt werden. Dazu zählen auch die mittlerweile zahlreich vorhandenen grafischen Tools, die eine Entwicklung erheblich erleichtern können. Ein gutes Werkzeug für die Nutzung von Git und SVN stellt dabei das für private Anwender kostenlos angebotene Tool SmartGit dar. Unter anderem bietet die kommende Version 2.1 neben einem grafischen Merge eine Branch-Verwaltung und bidirektionales Mapping von SVN- und Git-Optionen.

Die Stärke von Git gegenüber von SVN liegt vor allem in der Nutzung von Branches und der lokalen Arbeitsweise. Im Zusammenspiel zwischen den beiden Systemen ergeben sich dadurch mannigfaltige Vorteile. So lassen sich mittels des Kommandos

git commit -a

alle Änderungen in das lokale Git-Verzeichnis übertragen. Dabei werden die Änderungen nicht wie im Falle von SVN an den Server gesendet, sondern lediglich lokal abgespeichert. So lassen sie sich wieder rückgängig machen, in Branches unterteilen oder vor der finalen Übertragung untersuchen. Der weitere Vorteil der Lösung liegt bedingt durch die lokale Arbeitsweise auch darin, dass jede logische Änderung als ein separates Commit gespeichert werden kann, da Commits keinen Zugang zum Server benötigen.

Will man alle lokalen Änderungen an einen zentralen SVN-Server übertragen, so geschieht das mittels

git svn dcommit

Dabei werden die bereits abgespeicherten lokalen Commits gesammelt übertragen. Im SVN erscheinen sie dagegen weiterhin als einzelne Commits mit der zuvor bei jedem einzelnen Commit festgelegten Beschreibung der Änderungen.

Abschließend sei noch erwähnt, dass sich dieser Tipp keinesfalls als eine vollständige Referenz aller verfügbaren Funktionen von Git und git-svn versteht. Das System unterstützt bei weitem mehr, als hier beschrieben wurde.