Konvertierung zu Git

Umwandlung

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 und dann reinigen wir die Ergebnisse mit svn-migration-scripts.jar.

Beware that the conversion process can take a significant amount of time for larger repositories, even when cloning from a local SVN repository. As a benchmark, converting a 400MB repository with 33,000 commits on master took around 12 hours to complete.

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.

Clone the SVN repository

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.

Git migration: git svn clone command

Standard SVN layouts

Wenn bei deinem SVN-Projekt das standardmäßige /Trunk, /Branchesund /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 <svn-repo> die URI des SVN-Repository, zu dem du migrieren willst, und <project> der Name des Projekts, den du importieren willst, und <git-repo-name> der Name des Verzeichnis des neuen Git-Repository.

Wenn du beispielsweise ein Projekt namens Confluence migrieren willst, das auf https://svn.atlassian.comgehostet wird, kannst du Folgendes ausführen:

git svn clone --stdlayout --authors-file=authors.txt
https://svn.atlassian.com/Confluence ConfluenceAsGit

Non-standard 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, --branchesund --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>

Inspect the new Git repository

Wenn git svn clone abgeschlossen hat (das kann eine Weile dauern), findest du ein neues Verzeichnis mit der Bezeichnung <git-repo-name> in ~/GitMigration. Das ist das konvertierte Git-Repository. Du solltest zu <git-repo-name> 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.

Git migration: structure of cloned Git repo

This behavior makes certain two-way synchronization procedures easier, but it can be very confusing when trying to make a one-way migration Git. That’s why our next step will be to convert these remote branches to local branches and actual Git tags.

Clean the new Git repository

Das Skript clean-git, das in svn-migration-scripts.jarenthalten 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/<git-repo-name>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.

Summary

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.jarbereinigt. 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.

Du möchtest mit Git arbeiten?

Sieh dir dieses interaktive Tutorial an.

Jetzt loslegen