Git convert: ein Schritt der Migration von SVN zu Git
Der nächste Schritt bei der Migration vom SVN zu Git ist der Import der Inhalte des SVN-Repository in ein neues Git-Repository. Wir machen das mit dem Dienstprogramm git svn
, das bei den meisten Git-Distributionen inbegriffen ist. Anschließend bereinigen wir die Ergebnisse mit svn-migration-scripts.jar
*.
Beachte, dass der Konvertierungsprozess für größere Repositorys sehr viel Zeit in Anspruch nehmen kann, auch wenn von einem lokalen SVN-Repository geklont wird. Als Anhaltspunkt: Die Konvertierung eines 400 MB Repositorys mit 33.000 Commits auf dem Main-Branch dauerte rund 12 Stunden.
Für angemessen große Repositorys sollten die folgenden Schritte auf dem lokalen Computer des Migration Lead ausgeführt werden. Wenn du jedoch ein sehr großes SVN-Repository hast und die Konvertierungszeit reduzieren willst, kannst du git svn clone
auf dem SVN-Server ausführen, anstatt auf dem lokalen Rechner des Migration Lead. Damit wird der Mehraufwand des Klonens über eine Netzwerkverbindung vermieden.
* Bitte beachte, dass diese Skripte geschrieben wurden, als nur Git Version 1.8.x verfügbar war. Daher muss diese Version von Git verwendet werden, damit die Skripte funktionieren.
Das SVN-Repository klonen
Der Befehl git svn clone
transformiert Trunk, Branches und Tags in deinem SVN-Repository in ein neues Git-Repository. Je nach der Struktur deines SVN-Repository muss der Befehl unterschiedlich konfiguriert werden.
Zugehöriges Material
Verschieben eines vollständigen Git-Repositorys
Lösung anzeigen
Git kennenlernen mit Bitbucket Cloud
Standard SVN-Layouts
Wenn bei deinem SVN-Projekt das standardmäßige /Trunk
, /Branches
und /Tags
Verzeichnis-Layout verwendet wird, kannst du die Option --stdlayout
verwenden, anstatt die Struktur des Repository manuell anzugeben. Führe den folgenden Befehl im Verzeichnis ~/GitMigration
Directory aus:
git svn clone --stdlayout --authors-file=authors.txt
<svn-repo>/<project> <git-repo-name>
Dabei ist
die URI des SVN-Repositorys, zu dem du migrieren willst, und
der Name des Projekts, das du importieren willst, und
der Name des Verzeichnis des neuen Git-Repositorys.
Wenn du beispielsweise ein Projekt namens Confluence
migrieren willst, das auf https://svn.atlassian.com
gehostet wird, kannst du Folgendes ausführen:
git svn clone --stdlayout --authors-file=authors.txt https://svn.atlassian.com/Confluence ConfluenceAsGit
Nicht standardmäßige SVN-Layouts
Wenn dein SVN-Repository kein Standardlayout hat, musst du den Standort des Trunks, der Branches und Tags angeben und dafür die Befehlszeilenoptionen --trunk
, --branches
und --tags
verwenden. Wenn du beispielsweise Branches sowohl im Verzeichnis /branches
und den /bugfixes
Verzeichnissen gespeichert hast, würdest du den folgenden Befehl verwenden:
git svn clone --trunk=/trunk --branches=/branches
--branches=/bugfixes --tags=/tags --authors-file=authors.txt
<svn-repo>/<project> <git-repo-name>
Das neue Git-Verzeichnis überpüfen
Wenn git svn clone
abgeschlossen ist (das kann eine Weile dauern), findest du ein neues Verzeichnis mit der Bezeichnung
in ~/GitMigration
. Das ist das konvertierte Git-Repository. Du solltest zu
wechseln und jeden der Standard-Git-Befehle ausführen können, um dein Projekt zu erkunden.
Branches und Tags werden erwartungegemäß nicht in das neue Git-Repository importiert. Du wirst keine der SVN-Branches in git branch
finden oder deine SVN-Tags in git tag
. Wenn du aber git branch -r ausführst,
findest du alle Branches und Tags von deinem SVN-Repository. Der Befehl git svn clone
importiert deine SVN-Branches als Remote Branches und importiert deine SVN-Tags als Remote Branches, die über das Präfix tags/
verfügen.
Dieses Verhalten macht bestimmte bidirektionale Synchronisierungsverfahren leichter, aber es kann sehr verwirrend sein, wenn versucht wird, ein monodirektionales Migration Git zu erstellen. Daher besteht unser nächster Schritt darin, diese remote Branches in lokale Branches und tatsächliche Git-Tags zu konvertieren.
Das neue Git-Repository reinigen
Das Skript clean-git,
das in svn-migration-scripts.jar
enthalten ist,konvertiert die SVN-Branches zu lokalen Git-Branches und die SVN-Tags in richtige Git-Tags. Bitte beachten, dass dies ein destruktiver Vorgang ist und du keine Commits vom Git-Repository zurück in das SVN-Repository bringen kannst.
Wenn du diese Migrationsanleitung befolgst, ist das kein Problem, da eine monodirektionale Synchronisierung von SVN zu Git bevorzugt wird (das Git-Repository gilt bis nach dem Migrate -Schritt als schreibgeschützt). Wenn du jedoch vorhast, dich auf das Git-Repository und das SVN-Repository während des Migrationprozesses festzulegen, solltest du die folgenden Befehle nicht ausführen. Das ist eine fortgeschrittene Aufgabe, die für normale Projekte nicht empfohlen wird.
Um zu sehen, was gereinigt werden kann, den folgenden Befehl ~/GitMigration/
ausführen in:
java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar clean-git
Das gibt alle vom Skript geforderten Änderungen aus, führt jedoch keine davon aus. Um diese Änderungen auszuführen, musst du die Option --force
verwenden und zwar so:
java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar clean-git --force
Jetzt solltest du alle SVN-Branches unter git branch
sowie die SVN-Tags unter git tag
sehen. Das bedeutet, dass dein SVN-Projekt erfolgreich in ein Git-Repository konvertiert wurde.
Zusammenfassung
In diesem Schritt hast du ein SVN-Repository mit dem Befehl git svn clone
in ein neues Git-Repository konvertiert und dann die Struktur des erhaltenen Repository mit svn-migration-scripts.jar
bereinigt. Im nächsten Schritt lernst du, wie dieses neue Git-Repository mit allen neuen Commits im SVN-Repository in synchronisiertem Status gehalten wird. Dieses Verfahren ist mit der Konvertierung vergleichbar, aber es gibt ein paar wichtige Workflow-Aspekte in dieser Übergangsphase.
Diesen Artikel teilen
Nächstes Thema
Lesenswert
Füge diese Ressourcen deinen Lesezeichen hinzu, um mehr über DevOps-Teams und fortlaufende Updates zu DevOps bei Atlassian zu erfahren.