Skip to content

Git auf ein SVN Repository aufsetzen

Mittlerweile benutze ich GIT schon seit ca. 2 Wochen und werde immer sicherer mit dessen Mechanismen. GIT bietet einfach geniale Features, gerade bei der Zusammenarbeit z.B. in Open Source Projekten wie Serendipity. Das viel einfachere Branching und Rebasing auf dem online Branch klappt einfach wunderbar und löst sehr elegant einige Probleme, die man mit SVN und CVS bei der gemeinsamen Arbeit an einem Code hat.

Viele Open Source Projekte werden jedoch noch in einem SVN Repository gewartet. So programmiere ich mir gerade aus gegebenen Anlass einige Fixes in den Wordpress für Android Client, der als Open Source in einem SVN Repostitory verfügbar ist.

Inzwischen möchte ich aber auf die Vorzüge von GIT nicht mehr verzichten. Ich möchte einen eigenen Branch verwalten, den ich immer wieder auf die Änderungen in dem SVN Repository aufsetze (rebase), wodurch ich auf einfache Weise Änderungen beider Repositories immer in meinem Client Code habe.

Für diesen Anwendungsfall gibt es eine Erweiterung zu GIT: git svn. Diese Erweiterung baut lokal ein GIT Repository auf Grundlage eines SVN Repositories auf, mit allen Möglichkeiten, die man von GIT so kennt. Es wird ein git-svn Branch lokal angelegt, der mit SVN über git svn Befehle synchron gehalten werden kann. Auf diesen setzt ein lokaler master Branch auf, der mit rebase auf git-svn immer die neuesten Änderungen des SVN Repositories enthält und auf den wiederum eigene Feature Branches aufgesetzt und rebased werden können.

Wie das funktioniert, ist in diesem Artikel recht ausführlich beschrieben, ich fasse mal die für diesen Anwendungsfall wichtigen Schritte zusammen.

Überblick

Folgende Konfiguration werden wir haben, wenn alles fertig konfiguriert ist:

 

Das erzeugte GIT Repository hat einen Branch git-svn, der ein Spiegel des SVN Repositories ist und aus Sicht der Tools als Remote auftritt. git-svn hat eine ähnliche Funktion, wie ein remote GIT Repository z.B. auf GitHub. Dies muss man im Auge behalten, wenn man mit dieser Konfiguration arbeitet: Zwischen den grünen Bereichen kann man wie gewohnt mit den GIT Tools arbeiten (z.B. auch aus Eclipse heraus mit eGit), die Verbindung zwischen dem grünen und dem blauen Repository (also zwischen git und svn) wird mit git svn Aufrufen gepflegt.

Vorbereitungen

Ich gehe davon aus, dass SVN und GIT bereits auf dem Rechner installiert ist. Fehlt also nur noch GIT-SVN. Das bekommen wir über

$ sudo apt-get install git-core git-svn 

Dieses Beispiel soll anhand des oben erwähnten WordPress für Android SVN Repositories nachvollzogen werden. Somit braucht es einige Informationen zu diesem Repository. Als erstes natürlich die URL zu dem Repository: http://android.svn.wordpress.org

Wir könnten nun mittels git-svn das gesamte Repository mit samt seiner Geschichte clonen, das ist aber nicht notwendig in meinem Fall, ich bin nur an der aktuell neuesten Version des Repositories interessiert. Dazu benötigt es Informationen, wie der trunk gerade aussieht. Diese holen wir uns über ein svn Kommando ab:

$ svn log http://android.svn.wordpress.org/trunk | head
------------------------------------------------------------------------
r553 | mrroundhill | 2011-12-30 17:51:41 +0100 (Fr, 30. Dez 2011) | 1 Zeile

Protect post deletion.
------------------------------------------------------------------------
r552 | mrroundhill | 2011-12-30 17:25:05 +0100 (Fr, 30. Dez 2011) | 1 Zeile

Reset postsShouldRefresh
------------------------------------------------------------------------
r551 | mrroundhill | 2011-12-30 17:11:27 +0100 (Fr, 30. Dez 2011) | 1 Zeile

Dies ist die Ausgabe, die ich aktuell bekomme. Was man hier sieht ist, dass der Trunk im Moment bei der Revision 553 ist.

Aufsetzen des lokalen Repositories

Mit diesen Informationen können wir nun unser lokales GIT Repository als Spiegel des SVN Repositories aufsetzen. Es wird ein Verzeichnis angelegt, in dem das Projekt mit seinem GIT Repository angelegt werden soll, danach wird das Repository initialisiert:

$ mkdir wp-android
$ cd wp-android
$ git svn init http://android.svn.wordpress.org
Initialized empty Git repository in /home/grischa/tmp/wp-android/.git/

An dieser Stelle haben wir ein leeres lokales GIT Repository, das mit dem SVN Repository verknüpft ist und mit gt svn Befehlen mit dem SVN Repository synchronisiert werden kann. Eben jenes tun wir jetzt. Mit dem Wissen, dass der Trunk gerade bei der Revision 553 ist, rufen wir nun folgendes auf:

$ git svn fetch -r553 

Das Repository ist nun mit der Revision 553 des SVN Repositories gefüllt. Es existieren zwei Branches in diesem: master und git-svn.

$ git log --graph --all --decorate
* commit bfdf99b382b5079a7db1ae79c5de34d765ceed9e (HEAD, git-svn, master)

Hierbei ist der Branch git-svn jener, der mit dem SVN Repository synchronisiert wird, wenn die git-svn Kommando Zeilen benutzt werden.

  • git svn fetch: Holt neue Änderungen im SVN Repository in das lokale GIT Repository (und zwar in den branch git-svn). Wenn wir diese Änderungen auch im master Branch haben wollen, so müssen wir ein rebase des master auf git-svn ausführen.
  • git svn dcommit: Solltet ihr auch Schreibrecht auf das SVN Repository haben, so könnt ihr hiermit alle Änderungen im git-svn Branch in das SVN Repository puschen. Das Kommando dcommit ist hier etwas unglücklich, git svn push wäre vermutlich eingängiger gewesen.

Benutzung des Repositories mit Eclipse und EGit

Um das gerade erstellte Repository in Eclipse zu benutzen, muss es dort importiert werden. Dabei importieren wir kein (in dem Fall) Java Projekt, da so die Verknüpfung zum eigentlichen Repository nicht mit installiert wird. Wir importieren ein GIT Projekt:

  • Öffne als Workspace das Verzeichnis, in dem das Verzeichnis wp-android ist. 
  • Rechter Mausklick im Projekt Explorer, Import, Import..
  • Im sich öffnenden Dialog wird Git > Projects from Git ausgewählt
  • Im nächsten Dialog wird ein Git Repository hinzugefügt (Add..)
  • Als Verzeichnis das wp-android Projekt auswählen, dann "Search" drücken.Es sollte in der Liste das Verzeichnis wp-android/.git selektiert sein.
  • Immer weiter ok und next drücken (evtl zwischendurch das trunk Repository auswählen, wenn ihr mehr als trunk ausgecheckt habt), dann ist das Projekt aufgesetzt.

Eclipse arbeitet wie üblich auf dem master branch, von dem aus eigene Branches angelegt werden können. git-svn ist hier nicht zu sehen (es ist ein Remote Tracking), die Synchronisierung dieses Branches passiert weiterhin auf der Kommandozeile, in Eclipse könnt ihr aber immer euren master auf git-svn rebasen.

Dies war nebenbei mein größtes Missverständnis: Ich wunderte mich immer, warum ein git svn fetch zwar etwas abholte, diese Änderungen aber nicht in Eclipse erschienen. Genau: nur git-svn wurde erneuert, master (das von Eclipse aus zu sehen ist) war aber noch im alten Zustand und benötigte erst mal einen rebase. Wenn man git-svn aber als Remote Repository versteht (was es real nicht ist, aber aus Sicht von Eclipse schon), dann verhält sich dies jedoch genauso wie mit z.B. GitHub Repositories. Will man Änderungen aus diesen abholen, muss man ja ebenfalls einen Fetch / Rebase des Masters auf das remote Repository ausführen.

Fazit

Geniale Sache! Wir können nun mit normalen GIT Werkzeugen wie gewohnt Änderungen vornehmen, dabei jedoch auch immer weiter Änderungen aus dem Remote SVN abholen. Man könnte sogar noch einen Schritt weiter gehen: Den eigenen master könnte man in ein GitHub Repository pushen. Dieses könnte z.B. einen speziellen Serendipity Ableger des WP Android Clients pflegen, in den auf einfache Weise (rebase des masters auf git-svn, dann pushen nach GitHub) Änderungen aus der ursprünglichen Applikation immer weiter mit einfließen würden.

Trackbacks

Keine Trackbacks

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

Noch keine Kommentare

Kommentar schreiben

Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.
Dieses Blog erlaubt Dir, Audio Kommentare über audioboo.fm hinzuzufügen. Erstelle einen neuen Boo und gib hier den Link auf die Seite Deines Boos ein.
record
Wenn Du Deinen Twitter Namen eingibst wird Deine Timeline in Deinem Kommentar verlinkt.
Bewirb einen Deiner letzten Artikel
Dieses Blog erlaubt Dir mit Deinem Kommentar einen Deiner letzten Artikel zu bewerben. Bitte gib Deine Blog URL als Homepage ein, dann wird eine Auswahl erscheinen, in der Du einen Artikel auswählen kannst. (Javascript erforderlich)
(Bedingung: 1 Kommentare geschrieben)
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
tweetbackcheck