{"id":22441,"date":"2026-01-31T08:34:47","date_gmt":"2026-01-31T07:34:47","guid":{"rendered":"https:\/\/linux-bibel.at\/?p=22441"},"modified":"2026-01-31T08:34:49","modified_gmt":"2026-01-31T07:34:49","slug":"svn-all-fast-export-svn-repositorys-unter-linux-ins-git-konvertieren","status":"publish","type":"post","link":"https:\/\/linux-bibel.at\/index.php\/2026\/01\/31\/svn-all-fast-export-svn-repositorys-unter-linux-ins-git-konvertieren\/","title":{"rendered":"SVN-All-Fast-Export &#8211; SVN-Repositorys unter Linux ins Git konvertieren"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Ich habe letztes Jahr von <a href=\"https:\/\/linux-bibel.at\/index.php\/2024\/10\/04\/svn-repositorys-nach-git-konvertieren\/\" data-type=\"post\" data-id=\"16639\">Git-SVN<\/a> berichtet &#8211; mit dieser Software lassen sich SVN-Repositorys ins Git konvertieren, wenn diese nicht zu aufwendig sind! Sobald jedoch eine kleine Schwierigkeit auftritt, hat es sich damit auch schon erledigt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nach kurzer Zeit bin ich auf die Software SVN-All-Fast-Export gesto\u00dfen, sie nennt sich nebenbei auch Svn2Git. Entwickelt wurde die Software von der KDE-Community, um die KDE-Entwicklung damals von SVN auf Git umzustellen. Und &#8211; nach einigen sehr umfangreichen und auch umst\u00e4ndlichen SVN-Repos &#8211; es funktioniert pr\u00e4chtig.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">SVN-All-Fast-Export installieren<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Unter auf Debian basierenden Linux-Distributionen installieren Sie diese Software wie \u00fcblich \u00fcber die Paket-Verwaltung durch das Paket &#8222;<strong>svn-all-fast-export<\/strong>&#8222;.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">SVN-All-Fast-Export nutzen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Grunds\u00e4tzlich &#8211; es ist einfach, auch aufwendige SVN-Repos ins Git zu verschieben, es kostet hin und wieder aber auch Zeit. SVN-All-Fast-Export aberbeitet jedoch um einiges schneller, als Git-SVN &#8211; um vieles schneller sogar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Grunds\u00e4tzlich ben\u00f6tigen Sie einmal alle Autoren, die im SVN-Repo gearbeitet haben, hierzu clonen Sie sich das Repo am einfachsten auf den lokalen Rechner &#8211; also etwa:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>svn co https:\/\/server.org\/svn-repo\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sie wechseln auf dem Terminal ins geklonte Verzeichnis und holen sich die Autoren mit folgendem Befehl:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>svn log --xml --quiet | grep author | sort -u | perl -pe 's\/.*>(.*?)&lt;.*\/$1 = \/'<\/code><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Je nach Gr\u00f6\u00dfe des Repos kann dies auch einige Minuten dauern &#8211; Sie erhalten eine Liste mit Benutzern, ein Beispiel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user =\nuser1 =\nuser2 =<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sie kopieren sich diese Liste und f\u00fcgen diese in eine Textdatei ein, diese nenne ich jetzt beispielsweise &#8222;<strong>authors.txt<\/strong>&#8222;. Hier geben Sie den Benutzern eine Git-Vertr\u00e4gliche Namensnennung &#8211; beispielsweise:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user = Benutzer Eins &lt;mail-adresse@.org\nuser1 = Benutzer Zwei &lt;mail-adresse1@org\nuser2 = Benutzer Drei ...\n(no author) = no_author &lt;no_author@no_author><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die letzte Zeile hilft dabei, wenn ein Autor nicht ermittelt werden konnte. Anschlie\u00dfend benennen Sie das Verzeichnis mit dem Repo um &#8211; Sie ben\u00f6tigen es noch f\u00fcr die Verzeichnis-Struktur des Repos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt ben\u00f6tigen Sie noch das Original-Verzeichnis des Repos, so wie es auf dem Server liegt &#8211; also nicht das eigentliche geklonte Repo, sondern das Verzeichnis mit der Konfiguration des Repos. Ich habe mir dieses meist einfach mit scp auf den lokalen Rechner kopiert &#8211; also etwa:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>scp -r root@server.org:\/svn\/repo-verzeichnis\/ \/home\/robert\/svn2git\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Im Beispiel habe ich jetzt im Verzeichnis &#8222;<em>svn2git<\/em>&#8220; das umbenannte, geklonte Repo &#8222;<em>repo-umbenannt<\/em>&#8222;, das kopierte Repo-Verzeichnis &#8222;<em>repo<\/em>&#8220; und die Datei &#8222;<strong>authors.txt<\/strong>&#8222;. Der \u00dcbersicht halber, lege ich jetzt noch ein Verzeichnis namens &#8222;<em>git<\/em>&#8220; an &#8211; in diesem soll anschlie\u00dfend das konvertierte Git-Repo liegen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Was wir jetzt noch ben\u00f6tigen, sind die Regeln, mit denen Svn2Git arbeiten soll. Die Dateiendung daf\u00fcr nennt sich &#8222;<strong>.rules<\/strong>&#8222;, die Textdatei nenne ich jetzt einfach &#8222;<strong>repo.rules<\/strong>&#8222;. In dieser Textdatei beginnen wir damit, die Git-Repo-Namen anzulegen &#8211; im Beispiel ist im SVN-Repo nur ein Repo vorhanden, das Repo nenne ich &#8222;<strong>git-repo<\/strong>&#8222;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>create repository git-repo\nend repository<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sind mehrere SVN-Repos darin vorhanden:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>create repository git-repo\nend repository\ncreate repository zweites-repo\nend repository\n...<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Im n\u00e4chsten Abschnitt geben Sie an, was mit den Verzeichnissen im SVN-Repo geschehen soll &#8211; ein sehr einfaches SVN-Repo hat folgende Unterverzeichnisse:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>trunk<\/td><td>Aktuelle Dateien<\/td><\/tr><tr><td>tags<\/td><td>Tags<\/td><\/tr><tr><td>branches<\/td><td>Branches<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Je nach Repo k\u00f6nnen Tags und Branches auch wegfallen, auch k\u00f6nnen sich diese etwas anders nennen, wie es eben erstellt und genutzt wurde. Was mit den Verzeichnissen geschehen soll, geben Sie mit <code>match<\/code> an:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>match \/trunk\/\n  repository git-repo\n  branch master\nend match<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sie geben nicht das Verzeichnis des Repos an, sondern Sie beginnen ab den Unterverzeichnissen. Jetzt gehen Sie weiter mit den vorhandenen Verzeichnissen, um etwa alle Tags und Branches zu \u00fcbernehmen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>match \/tags\/(&#91;^\/]+)\/\n  repository git-repo\n  branch refs\/tags\/\\1\n  substitute branch s\/ \/_\/\nend match\n\nmatch \/branches\/(&#91;^\/]+)\/\n  repository git-repo\n  branch refs\/tags\/\\1\n  substitute branch s\/ \/_\/\nend match<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Einzelne weitere Verzeichnisse, die im Repo liegen, geben Sie als eigene Repos an &#8211; also etwa:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>match \/anderes_Verzeichnis\/\n  repository zweites-repo\n  branch master\nend match<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">M\u00f6chten Sie Verzeichnisse ausschlie\u00dfen, geben Sie diese wie folgt an:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>match \/auszuschlie\u00dfendes-Verzeichnis\/\nend match<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Oder wollen Sie alle nicht angegebenen Verzeichnisse ausschlie\u00dfen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>match \/\nend match<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Manche schwindligen Repos enthalten auch einzelne Dateien, mit solchen gehen Sie ebenso vor. Hin und wieder kann die Software nicht weitermachen, weil Verzeichnisse ausgeschlossen wurden &#8211; mit solchen wurden aber vielleicht Tags oder Branches angelegt. In solchen F\u00e4llen schlie\u00dfen Sie diese nicht aus, sondern legen ein extra-Repo an und konvertieren diese einfach in ein solches &#8211; Svn2Git holt sich diese dann, wie sie gebraucht werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Haben Sie die Regeln erstellt, wechseln Sie in das neu angelegte Verzeichnis &#8211; ich habe es, wie oben beschrieben &#8222;<em>git<\/em>&#8220; genannt. Dort wird die Konvertierung auf dem Terminal gestartet (<em>nach dem Beispiel oben<\/em>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>svn-all-fast-export --identity-map=..\/authors.txt --rules=..\/repo.rules --stats --add-metadata \/home\/robert\/svn2git\/repo\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Mit <code>--identity-map=<\/code> geben Sie die Autoren-Datei an, mit <code>--rules=<\/code> die Regel-Datei. Zuletzt folgt das vom Server kopierte Verzeichnis, nicht das geklonte. Sie k\u00f6nnen auch Revisionen ausschlie\u00dfen &#8211; dies gelingt mit der Textdatei &#8222;<strong>rev.txt<\/strong>&#8220; im Verzeichnis mit den Regeln &#8211; hier geben Sie an, welche Revisionen konvertiert werden sollen,ein Beispiel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>0-10\n12-200\n210-230<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Im Befehl geben Sie diese wie folgt an:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>--revisions-file=..\/rev.txt<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die Software beginnt zu konvertieren und l\u00e4sst Sie mitsehen, was gerade geschieht, zeigt am Ende das Log. Zuletzt zeigt die Software alle von Ihnen angegebenen Verzeichnisse &#8211; dahinter eine Zahl mit den Treffern. Ist hier eine Zahl bei Null, konnte die Software damit nichts anfangen und Sie haben eine fehlerhafte oder keine Konvertierung. Scollen Sie \u00fcber die Verzeichnisse &#8211; dort finden Sie in den letzten zwei Zeilen die Fehlermeldung, meist handelt es sich um nicht angegebene Verzeichnisse, weil diese etwa gel\u00f6scht oder umbenannt wurden. Geben Sie an, was damit geschehen soll und starten erneut, bis Sie keine Fehlermeldungen mehr vorfinden. Im Verzeichnis, in dem Sie den Befehl gestartet haben, finden Sie anschlie\u00dfend die Verzeichnisse mit den erstellten Git-Repos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In diese Verzeichnisse k\u00f6nnen Sie nun wechseln und schon einmal testen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git log\ngit tag\ngit branch<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Erhalten Sie eine Fehlermeldung, sehen Sie sich wieder die Logs an, Sie haben vergessen eines oder mehrere Verzeichnisse anzugeben.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ist die Konvertierung gelungen &#8211; und dies tut sie irgendwann, legen Sie im Git die neues Repos an und schupfen die einzelnen Repos, deren Tags und Branches ins Git. Sie haben dann dort die komplette History, die Tags und Branches.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wichtig vor allem &#8211; SVN erlaubt auch etwa einen Trunk unter einem Trunk &#8211; Git tut dies nicht, einen Trunk unter einem Trunk, m\u00fcssen Sie als eigenes Git-Repo konvertieren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Svn2Git funktioniert perfekt und mehr als doppelt so schnell, wie Git-SVN.<\/p>\n<div class=\"pld-like-dislike-wrap pld-custom\">\r\n    <div class=\"pld-like-wrap  pld-common-wrap\">\r\n    <a href=\"javascript:void(0)\" class=\"pld-like-trigger pld-like-dislike-trigger  \" title=\"Gef\u00e4llt mir\" data-post-id=\"22441\" data-trigger-type=\"like\" data-restriction=\"cookie\" data-already-liked=\"0\">\r\n                            <img src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/12\/Daumen-Hoch.png\" alt=\"Gef\u00e4llt mir\" \/>\r\n            <\/a>\r\n    <span class=\"pld-like-count-wrap pld-count-wrap\">4    <\/span>\r\n<\/div><div class=\"pld-dislike-wrap  pld-common-wrap\">\r\n    <a href=\"javascript:void(0)\" class=\"pld-dislike-trigger pld-like-dislike-trigger  \" title=\"Gef\u00e4llt mir nicht\" data-post-id=\"22441\" data-trigger-type=\"dislike\" data-restriction=\"cookie\" data-already-liked=\"0\">\r\n                            <img src=\"https:\/\/linux-bibel.at\/wp-content\/uploads\/2023\/12\/Daumen-Runter.png\" alt=\"Gef\u00e4llt mir nicht\" \/>\r\n            <\/a>\r\n    <span class=\"pld-dislike-count-wrap pld-count-wrap\"><\/span>\r\n<\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>Ich habe letztes Jahr von Git-SVN berichtet &#8211; mit dieser Software lassen sich SVN-Repositorys ins Git konvertieren, wenn diese nicht zu aufwendig sind! Sobald jedoch eine kleine Schwierigkeit auftritt, hat es sich damit auch schon erledigt. Nach kurzer Zeit bin ich auf die Software SVN-All-Fast-Export gesto\u00dfen, sie nennt sich nebenbei auch Svn2Git. Entwickelt wurde die [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":22442,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[48],"tags":[49],"class_list":["post-22441","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-entwicklung","tag-entwicklung"],"_links":{"self":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/22441","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/comments?post=22441"}],"version-history":[{"count":1,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/22441\/revisions"}],"predecessor-version":[{"id":22443,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/22441\/revisions\/22443"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/media\/22442"}],"wp:attachment":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/media?parent=22441"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/categories?post=22441"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/tags?post=22441"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}