blog · git · desktop · images · contact & privacy · gopher


Git hinter SVN: Crashkurs und Erfahrungswerte

Bei uns an der Uni wird durchgängig SVN genutzt und viele freie Projekte tun das auch. Vorteile hat's bestimmt hier oder da. Wenn man sich aber erstmal an Git gewöhnt hat, dann fällt der Wechsel zurück auf SVN unglaublich schwer. Muss aber nicht sein. :)

Git kommt direkt mit einem Client für SVN. Der Effekt ist dann der, dass man nach außen hin wie ein normaler SVN-Benutzer aussieht (fast zumindest -- dazu später mehr), bei sich lokal aber alle Vorteile von Git nutzen kann. Insbesondere heißt das, dass man funktionierendes Branching hat und sich seine Commits gescheit zurechtschnüren kann. Überhaupt: Man hat lokale Commits.

Das ist auch dann sehr hilfreich, wenn man an einem Stück freier Software interessiert ist und dafür einen Patch schreiben will. In der Regel hat man dann nämlich keinen Schreibzugriff auf das öffentliche SVN des Projekts, was einem genau einen Diff ermöglicht: Nämlich den zwischen dem aktuellen SVN-Head und seinen eigenen Änderungen. Nutze ich stattdessen heimlich Git hinter SVN, dann ist die ganze Aktion nicht nur wesentlich schneller, sondern ich kann lokal committen, diffen, experimentieren und meine Patches zurechtbauen. Je sauberer die Patches, desto höher ist ja auch die Wahrscheinlichkeit, dass sie letztenendes angenommen werden.

Um beispielsweise Art of Illusion über git-svn zu holen:

git svn clone https://aoi.svn.sourceforge.net/svnroot/aoi

Das wird erstmal eine ganze Ecke länger dauern als ein normaler SVN-Checkout. Liegt daran, dass die komplette History gezogen wird. Das lohnt sich aber sofort, denn eben diese History liegt dann lokal auf der Platte und ist dementsprechend schnell auslesbar. Über "gitk" hat man dann sofort einen prima Überblick -- und zwar immer, auch im Zug oder am Strand.

Am saubersten ist dann, auf extra Branches weiterzumachen. Hat man doch Schreibzugriff auf's SVN, geht man vor den SVN-Commits am besten zurück auf den Master-Branch und macht dort fertig, was reinkommen soll. Oder man schmeißt die Branches einfach weg, wenn's Unsinn war. Nur eines darf man natürlich nicht vergessen: SVN ist linear und kriegt hinterher überhaupt nichts mehr von der Akrobatik mit, die man mit Git so treiben kann. Lokale Verästelungen verschwinden also und die Historie wird wieder "platt".

Weiter geht es dann ungefähr so -- die Äquivalente zu den klassischen SVN-Befehlen sieht man hier auch:

$ git co -b dev
[work on dev-branch]
$ git co master             # Zurück zum SVN-Master.
$ git merge dev             # Eigene Änderungen auf Master mergen, wohl FF.
$ git svn rebase            # "svn up", eigene Änderungen auf aktuellen SVN-Head.
[Konflikte? --> lösen, git add, git rebase --continue]
$ git svn dcommit           # "svn ci", also rein damit ins SVN.
$ git branch -D dev         # Dev-Branch kann jetzt weg.

Jenes "git svn dcommit" haut dann jeden Diff einzeln ins SVN rein. Das heißt natürlich, dass später im SVN-Log nicht mehr der ursprüngliche Zeitpunkt zu sehen ist. Sieht sehr lustig aus, wenn man so 20 Commits in wenigen Sekunden macht. ;) Das ist auch der einzige Punkt, an dem man erkennen kann, dass jemand nicht das "originale" SVN benutzt hat. Sofern die Leute darauf achten... Wirklich schön ist das so zwar nicht, aber immernoch schöner als unfertige Commits zu machen oder gar einen riesigen nach einem Wochenende voller Arbeit ohne Internet.

Nett ist auch die Möglichkeit, das verteilte Git-Modell von diesem Punkt aus weiterzuführen. Ich kann also von meinem Laptop aus die Änderungen vom Desktop-Rechner pullen, dann am Laptop im Zug weitermachen und das später wieder rückwärts. Oder eben mit anderen Leuten zusammen am SVN "vorbeiarbeiten", es aber am Ende trotzdem alles schön geordnet im zentralen Pott haben. Da ich gerade Muße für eine illustrierende Skizze habe:

Skizze

Das funktioniert auch alles sehr nervenschonend und erstaunlich gut. Insbesondere in der Uni, wo, wie gesagt, eigentlich ausschließlich SVN genutzt wird, spart einem das viel Ärger. Das ist der typische Effekt, der dann eintritt: Man scheut sich einfach nicht mehr, sauber und häufig zu committen -- wenn man Mist baut, sieht's nämlich kein Mensch. :D

Wie die ganze Aktion mit nativen SVN-Branches zusammenarbeitet, weiß ich nicht. Ist mir noch nicht untergekommen und explizit ausprobiert hab ich's auch nicht. Das verwenden einfach zu wenige Leute. Und in der Uni gleich gar nicht. ;)