Migration von Subversion zu Git: Die Synchronisation

Den Migration eines Entwicklungsteams von Subversion (SVN) zu Git kann in fünf einfache Abschnitte aufgebrochen und somit so nahtlos und zielgerichtet wie möglich strukturiert werden. Nach den Vorbereitungen und der Konvertierung kann im dritten Stadium die eigentliche Synchronisation stattfinden.

Es ist nicht kompliziert, das Git-Repository mit neuen Commits in das Original-SVN-Repository zu synchronisieren. Diese Phase ist eine bequeme Transitionsperiode im Migrationsprozess, in der das Entwicklungsteam weiter nach dem bestehenden SVN-Workflow arbeiten kann, aber währenddessen auch schon mit Git experimentiert.

Die Synchronisation ist in beide Richtungen möglich. Empfehlenswert ist jedoch eine eingleisige Synchronisation von SVN zu Git. Während der Transitionsperiode sollte das Team nur in das SVN-Repository committen, nicht in das Git-Repo. Erst wenn das Team sicher genug für den Umstieg ist, kann der Migrationsprozess abgeschlossen werden, indem die Entwickler beginnen, Änderungen in das Git-Repository zu committen.

SVN Git 5

Commits landen also zunächst im SVN-Repo, während das Git-Repository, wann immer es nötig ist, synchronisiert wird. Dieser Prozess gleicht dem in der Konvertierungsphase, doch da es nur um inkrementelle Änderungen geht, sollte er deutlich effizienter sein.

Aktualisierung der Authors-Datei

Die Datei authors.txt, die genutzt wurde, um die SVN-Nutzernamen mit den Klarnamen und E-Mail-Adressen zu mappen, ist für den Synchronisationsprozess essenziell. Sie liegt nun nicht mehr unter ~/GitMigration/authors.txt, also muss die Stelle, an der sie zu finden ist, aktualisiert werden:

git config svn.authorsfile <path-to-authors-file>

Wenn seit der letzten Synchronisierung neue Entwickler in das SVN-Repository committet haben (oder seit der Erzeugung des initialen Klons), muss die Authors-Datei entsprechend aktualisiert werden. Das kann manuell geschehen, indem der Migrationsleiter neue User in die authors.txt einträgt. Er kann das auch mithilfe der Option --authors-prog bewerkstelligen. Mehr dazu gleich.

Bei einer einmaligen Synchronisation ist es normalerweise einfacher, die Authors-Datei direkt zu editieren. Die Option --authors-prog ist aber empfehlenswert, wenn Synchronisationen ohne Überwachung stattfinden (etwa als wiederkehrende Routine).

Git-Autoren automatisch generieren

Wenn die Authors-Datei nicht aktualisiert werden muss, kann der Migrationsleiter diesen Abschnitt überspringen.

Der Befehl git svn enthält eine Option --authors-prog, die auf ein Skript zeigt, das SVN-Nutzernamen automatisch in Git-Autoren transformiert. Das Skript muss so konfiguriert werden, dass es den SVN-Nutzernamen als einziges Argument akzeptiert und eine einzelne Zeile der Form Name <E-Mail> ausgibt (so wie auf der rechten Seite der bestehenden Authors-Datei). Diese Option kann sehr hilfreich sein, wenn dem Projekt immer wieder neue Entwickler hinzugefügt werden müssen.

Wenn der Migrationsleiter die Option --authors-prog nutzen möchte, muss er eine Datei namens authors.sh unter ~/GitMigration anlegen. Dann fügt er der Datei die folgende Zeile hinzu, um für jeden Autor, der nicht in der authors.txt zu finden ist, einen Dummy-Git-Namen und eine E-Mail-Adresse zu bekommen:

echo "$1 <$1@example.com>"

Dadurch werden Dummy-Namen und -E-Mail-Adressen auf Basis der SVN-Nutzernamen generiert, die dann entsprechend angepasst werden müssen.

Die neuen SVN-Commits fetchen

Anders als SVN unterscheidet Git zwischen dem Download von Upstream-Commits und der Integration ins Projekt. Ersteres wird Fetching genannt, während Letzteres durch Mergen oder Rebasing geschieht. Um alle neuen Commits aus dem Original-SVN-Repository zu fetchen, muss der Migrationsleiter im Verzeichnis ~/GitMigration das folgende Kommando ausführen:

git svn fetch

Dies entspricht insofern dem git svn clone-Befehl aus der vorangehenden Phase, dass nur die Remote-Branches des Git-Repositorys aktualisiert werden, nicht die lokalen Branches. Die Remote-Branches sollten exakt der History des SVN-Repositorys entsprechen.

Wenn der Migrationsleiter die Option --authors-prog nutzt, muss er sie in den obigen Befehl mit einbinden, etwa so:

git svn fetch --authors-prog=authors.sh

Synchronisation mit den gefetchten Commits

Das folgende Kommando übernimmt die heruntergeladenen Commits in das Repository:

java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar sync-rebase

Dadurch erfolgt das Rebasing der gefetchten Commits in die lokalen Branches, sodass sie den Remote-Gegenstücken entsprechen. In der git log-Ausgabe sollten nun die neuen Commits zu sehen sein.

Das Git-Repository nochmals bereinigen

Es ist empfehlenswert, nun nochmals das Skript git-clean durchlaufen zu lassen, um obsolete Tags oder Branches zu entfernen, die seit der letzten Synchronisation aus dem Original-SVN-Repository entfernt wurden:

java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar clean-git --force

Damit ist das Git-Repo mit dem SVN-Repository synchronisiert.

Zusammenfassung

Während dieser Transitionsperiode ist es wichtig, dass Entwickler nur in das SVN-Repository committen. Nur während der gerade beschriebenen Synchronisation sollte das Git-Repository aktualisiert werden. Das ist deutlich einfacher als ein wechselseitiger Synchronisierung-Workflow, erlaubt es dem Team aber, Git nach und nach in seinen Build-Prozess zu integrieren.

Wie das neue Git-Repository den anderen Entwicklern im Team zugänglich gemacht wird, ist Thema des nächsten Teils dieser Artikelreihe.

Weiterführende Infos: Ihr Partner für Git und Stash

Kennen Sie Stash von Atlassian? Stash bietet eine zentrale Lösung zum Management des gesamten distributierten Codes: Hier kommen alle Git-Repositories im Unternehmen zusammen, hier finden Entwickler immer die letzte offizielle Version eines Projekts, hier können Projektverantwortliche Berechtigungen kontrollieren, um sicherzustellen, dass die richtigen Nutzer Zugriff auf den richtigen Code haben.

Möchten Sie mehr erfahren? Wir sind offizieller Vertriebspartner von Atlassian und einer der größten Atlassian Experts Partner weltweit. Gerne unterstützen wir Sie bei der Evaluierung, Lizenzierung und Adaption von Stash. Und wenn Sie Atlassian-Lizenzen bei //SEIBERT/MEDIA kaufen, gewähren wir Ihnen einen Rabatt in Höhe von 10% der Lizenzkosten in Form von Beratungsleistungen. Bitte sprechen Sie uns einfach an.

Branch-basierte Git-Workflows mit Stash adaptieren
Echte Integration: Das Zusammenspiel von JIRA, Stash und Bamboo
Interview: Die Vorteile von Git in der Software-Entwicklung und die Möglichkeiten von Stash
So funktioniert die Lizenzierung von Atlassian-Produkten