Freitag, 13. Mai 2016

SVN zu Git Migration

Bis jetzt habe ich meine Projekte in einem svn Repository gepflegt. In letzter Zeit habe ich mich aber vermehrt mit git als Mittel zur Sourcecodeverwaltung beschäftigt. Daher entwickelte sich bei mir das Interesse, meine bestehenden Projekte von svn zu git zu migirieren. Eine sehr gute Dokumentation über git bietet folgende Seite git-scm.com

An dieser Stelle beschreibe ich, wie ein svn Projekt in ein git Projekt importiert werden kann. Dazu werde ich nur die einzelnen Schritte festhalten. Eine detailierte Dokumentation kann dem Kapitel 9.2 Git and Other Systems - Migrating to Git der obigen Seite entnommen werden.

Für die Migration von svn zu git wird das Paket "git-svn" benötigt. Falls dieses noch nicht vorhanden ist, kann dieses wie folgt installiert werden.

sudo apt-get update && sudo apt-get install git-svn

Jetzt kann mittels dem Befehl git svn clone "svn-url" ein svn Repository in ein git Repository umgewandelt werden. Dazu folgende Randbedingungen:

  1. Dieser Befehl klappt nur, wenn das svn Repository aus den "standard" Verzeichnissen trunk, branches und tags besteht. Wenn davon abgewichen wird, können diese mittels der Parameter -T, -b und -t angepasst werden.
  2. Weiterhin empfielt sich der Parameter --no-metadata. Damit sehen die commit Nachrichten besser aus, da die git-svn-id nicht eingetragen wird.
  3. Evtl. ist es notwendig ein Mapping der Autoren vorzunehmen. Dazu kann der Parameter --authors-file=users.txt verwendet werden. In der users.txt sind dann alle Autoren im format svn-user = git-user aufzuführen.

Für mein Beispiel Projekt ergab sich daraus folgender Befehl:

git svn clone http://192.168.2.112:8002/svn/repo/callist -T trunk -b branch -t tags --no-metadata

Durch diesen Schritt wurde aber nur der svn trunk in den git master branch überführt. Evtl. svn tags und branches bestehen noch als unschöne remote branches.

Um die Tags des SVN Repositories in git tags umzuwandeln, müssen deren Referenzen aus dem remote kopiert werden.

cp -Rf .git/refs/remotes/tags/* .git/refs/tags/

Anschließend können diese gelöscht werden.

rm -Rf .git/refs/remotes/tags

Diesen Schritt kann man mit dem Befehl git tag kontrollieren. Damit sollten nun alle Tags des svn Repositories auch im git Repository aufgelistet werden.

Um die Referenzen der Branches zu übernehmen, werden auch diese kopiert und anschließend aus dem remote gelöscht.

cp -Rf .git/refs/remotes/* .git/refs/heads/
rm -Rf .git/refs/remotes

Um die übernommen Branches zu kontrollieren, können diese mittels git branch -av aufgelistet werden. Dabei wird auffallen, dass auch für den svn trunk ein Branch angelegt wurde. Da sich dieser mit dem master Branch doppelt, kann er gelöscht werden.

git branch -d trunk

Damit ist die Migration von svn zu git abgeschlossen.

Wenn man möchte kann das so erzeugte lokale Repository noch auf einem Server gepusht werden. Dazu muss dieser als remote hinzugefügt werden und alle branches und tags gepusht werden.

git remote add orogin user@server_ip:repo_name.git
git push origin --all
git push origin --tags

Keine Kommentare:

Kommentar veröffentlichen