{"id":16639,"date":"2024-10-04T22:25:14","date_gmt":"2024-10-04T20:25:14","guid":{"rendered":"https:\/\/linux-bibel.at\/?p=16639"},"modified":"2024-10-04T22:25:16","modified_gmt":"2024-10-04T20:25:16","slug":"svn-repositorys-nach-git-konvertieren","status":"publish","type":"post","link":"https:\/\/linux-bibel.at\/index.php\/2024\/10\/04\/svn-repositorys-nach-git-konvertieren\/","title":{"rendered":"SVN-Repositorys nach Git konvertieren"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Letztens musste ich mir Gedanken machen, wie man SVN-Repositorys zu Git konvertiert. Bei SVN handelt es sich um ein inzwischen veraltetes Versionsverwaltungssystem &#8211; es kann noch genutzt werden,  aber Git hat einfach viel zu viele Vorteile.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Doch wie bekommt man die Daten von einem SVN-Repo in ein Git-Repo &#8211; nat\u00fcrlich mit allen Commits, die man auch im Git so nutzen kann, wie unter SVN? Hier die passende Anleitung.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">SVN zu Git konvertieren<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Als Erstes m\u00fcssen wir das komplette SVN-Repo auf einen Rechner auschecken, der die Konvertierung \u00fcbernehmen soll. Je nach Gr\u00f6\u00dfe des Repos kann dieser \u00fcber Minuten bis auch zu Tagen damit besch\u00e4ftigt sein.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In meinem Beispiel nennt sich das Repo <strong>svn.at\/Linux\/<\/strong> &#8211; wir checken erst einmal wie gewohnt aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>svn co https:\/\/svn.at\/Linux\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt ben\u00f6tigen wir noch die passende Software, die die Konvertierung \u00fcbernimmt. Unter auf Debian basierenden Linux-Distributionen installieren wir diese wie gewohnt \u00fcber die Paket-Verwaltung durch das Paket &#8222;<strong>git-svn<\/strong>&#8220; &#8211; am schnellsten gelingt dies als root auf dem Terminal mit dem Befehl:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apt update\napt install git-svn<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die Konvertierung l\u00e4uft am Terminal ab, das SVN-Repo muss online weiter erreichbar sein. Zu Beginn wechseln wir in das ausgecheckte Repo-Verzeichnis (<em>nach obigem Beispiel<\/em>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd Linux\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Mit dem ersten Befehl ermitteln wir die Namen der Beteiligten, also den Personen, die selbst Commits im Repo angelegt haben:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>svn log --xml --quiet | grep author | sort -u | perl -pe 's\/.<em>>(.<\/em>?)&lt;.*\/$1 = \/'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Als Ausgabe erhalten wir eine Liste mit den Namen, diese k\u00f6nnte etwa so aussehen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pinguin =\ntux =\ndebian =<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wir markieren diese Ausgabe und f\u00fcgen diese genau so in eine Textdatei ein &#8211; ich nenne diese beispielsweise &#8222;<strong>authors.txt<\/strong>&#8222;, die Datei liegt au\u00dferhalb des ausgecheckten Repo-Verzeichnisses. Diese wird jetzt mit einem beliebigen Texteditor bearbeitet &#8211; Sie f\u00fcgen dahinter die Namen und die E-Mail-Adresse ein:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pinguin = Pinguin Linux &lt;adresse@dada.com>\ntux = Tux &lt;adresse@tux.com>\ndebian = &lt;adresse@debian.org><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt beginnt die eigentliche Arbeit &#8211; wir gehen aus dem Verzeichnis heraus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd ..<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Und wir starten den Befehl zur Konvertierung &#8211; zuletzt geben Sie die erstellte Textdatei und das Repo-Verzeichnis an:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git svn clone https:\/\/svn.knapp.at\/ITSM --preserve-empty-dirs --prefix=svn\/ --include-paths=\"^project1\/trunk|^project2\/trunk|^some_root\/trunk\/project3|^archive\/project2\/trunk|^archive\/some_root\/trunk\/project3\" --authors-file authors.txt Linux<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Je nach Gr\u00f6\u00dfe des Repos, kann dies schon etwas dauern. In meinem Beispiel hat das Repo an die 175 GB &#8211; dauert locker 10 Stunden. Brechen Sie den Vorgang nicht ab &#8211; Sie m\u00fcssen wieder komplett von vorne beginnen (<em>Verzeichnis l\u00f6schen und wieder komplett auschecken<\/em>). Nachdem der Vorgang abgeschlossen ist, k\u00f6nnen Sie ins Verzeichnis wechseln und sich die einzelnen Commits ansehen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd Linux\/\ngit log<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt gehen wir an die ignorierten Dateien &#8211; dies ist der l\u00e4ngste Vorgang (<em>im Repo-Verzeichnis<\/em>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git svn show-ignore > .gitignore<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Auch hier &#8211; nicht abbrechen, bei meiner oben angegebenen Repo-Gr\u00f6\u00dfe dauerte dies vier Tage. Die restlichen Befehle runden den Vorgang ab und konvertieren alles perfekt f\u00fcr das Git:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git lfs install<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>git add -A<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>git commit -m 'Add .gitignore.'<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>for t in $(git for-each-ref --format='%(refname:short)' refs\/remotes\/tags); do git tag ${t\/tags\\\/\/} $t &amp;&amp; git branch -D -r $t; done<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>for b in $(git for-each-ref --format='%(refname:short)' refs\/remotes); do git branch $b refs\/remotes\/$b &amp;&amp; git branch -D -r $b; done<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>for p in $(git for-each-ref --format='%(refname:short)' | grep @); do git branch -D $p; done<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>git branch -d trunk<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das war die Konvertierung, jetzt k\u00f6nnen wir das komplette Paket in das gew\u00fcnschte Git-Repo hochladen, Beispiel:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git remote add origin git@my-git-server:myrepo.git<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>git push origin --all<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>git push origin --tags<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bei gro\u00dfen Repos kann der Vorgang schon etwas dauern &#8211; aber, es lohnt sich.<\/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=\"16639\" 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=\"16639\" 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>Letztens musste ich mir Gedanken machen, wie man SVN-Repositorys zu Git konvertiert. Bei SVN handelt es sich um ein inzwischen veraltetes Versionsverwaltungssystem &#8211; es kann noch genutzt werden, aber Git hat einfach viel zu viele Vorteile. Doch wie bekommt man die Daten von einem SVN-Repo in ein Git-Repo &#8211; nat\u00fcrlich mit allen Commits, die man [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":16640,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-16639","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-allgemein"],"_links":{"self":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/16639","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=16639"}],"version-history":[{"count":1,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/16639\/revisions"}],"predecessor-version":[{"id":16641,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/posts\/16639\/revisions\/16641"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/media\/16640"}],"wp:attachment":[{"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/media?parent=16639"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/categories?post=16639"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linux-bibel.at\/index.php\/wp-json\/wp\/v2\/tags?post=16639"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}