no way to compare when less than two revisions
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | adminstoriesmigrationvonsubversionnachgit [20120915 19:03] (aktuell) – angelegt Dirk Deimeke | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Migration von Subversion nach Git ====== | ||
+ | * Urspruenglicher Autor: Dirk Deimeke | ||
+ | * Urspruengliches Datum: 18.11.2011 | ||
+ | |||
+ | Aus verschiedenen Gruenden wollte ich unsere [[https:// | ||
+ | |||
+ | Git ist ein [[https:// | ||
+ | |||
+ | Weitere Vorteile sind (die Liste ist nicht komplett): | ||
+ | * Es gibt kaum ein System, was besser dokumentiert waere. | ||
+ | * Kleinerer Administrationsaufwand. | ||
+ | * Sparen eines Apache-Moduls | ||
+ | * Alle haben die komplette Historie lokal und koennen auch ohne Server arbeiten. | ||
+ | * Alle koennen beliebig oft lokal committen und alle Aenderungen erst dann uebertragen, | ||
+ | |||
+ | Einen sehr guten Einstieg in verteilte Versionskontrollsysteme und insbesondere Git bietet die [[http:// | ||
+ | |||
+ | Subversion wurde bei uns ueber '' | ||
+ | |||
+ | Da Taskwarrior [[https:// | ||
+ | |||
+ | <code bash> | ||
+ | |||
+ | Erzeugt einen User " | ||
+ | |||
+ | Danach muss ich den eigenen oeffentlichen SSH-Schluessel auf den Server kopieren und damit das Administrations-Repository initialisieren (darin wird die ganze Konfiguration gemacht). | ||
+ | |||
+ | <code bash> | ||
+ | dirk@server$ sudo -H -u gitosis gitosis-init < / | ||
+ | |||
+ | Damit ist die serverseitige Einrichtung bereits abgeschlossen. Unglaublich aber wahr. | ||
+ | |||
+ | Was nicht in der Anleitung steht, jetzt aber lokal erledigt werden sollte, da commits in Git immer Usernamen und E-Mail-Adresse enthalten: | ||
+ | |||
+ | <code bash>git config --global user.name "John Doe" | ||
+ | git config --global user.email " | ||
+ | git config --global color.ui always</ | ||
+ | |||
+ | Der letzte Befehl ist nicht wichtig, der macht es nur huebsch. | ||
+ | |||
+ | Jetzt kann das gerade angelegte Adminrepository ausgechecked werden: | ||
+ | |||
+ | <code bash>git clone gitosis@server: | ||
+ | |||
+ | Das letzte in der Kommandozeile ist der Name, wie das Verzeichnis lokal heissen soll. Ich habe ein " | ||
+ | |||
+ | Jetzt können der Admingruppe weitere User hinzugefügt werden. | ||
+ | |||
+ | In '' | ||
+ | |||
+ | < | ||
+ | writable = gitosis-admin | ||
+ | members = dirk@client dirk@workstation</ | ||
+ | |||
+ | Im Verzeichnis '' | ||
+ | |||
+ | < | ||
+ | total 12 | ||
+ | -rw-r--r-- 1 dirk dirk 393 Nov 4 10:50 dirk@client.pub | ||
+ | -rw-r--r-- 1 dirk dirk 395 Nov 4 10:54 dirk@workstation.pub</ | ||
+ | |||
+ | Die Aenderungen werden jetzt an den Server uebertragen. | ||
+ | |||
+ | <code bash>git add keydir/ | ||
+ | git commit -a -m "User dirk@workstation hinzugefuegt" | ||
+ | git push</ | ||
+ | |||
+ | Git verhaelt sich ein bisschen anders als Subversion. | ||
+ | |||
+ | * Bei einem "git commit" | ||
+ | * git add datei ; git commit -m " | ||
+ | * letzterer nimmt alle Dateien in den Commit, die bereits unter Versionskontrolle stehen und sich veraendert haben | ||
+ | * Der Commit ist lokal, erst "git push" uebertraegt die Änderungen zum Server | ||
+ | * Analog dazu synchronisiert sich "git pull" mit dem Server | ||
+ | |||
+ | Ein neues Repository auf dem Server legt man wie folgt an. Zuerst traegt man es in die gitosis.conf ein. | ||
+ | |||
+ | < | ||
+ | writable = playground | ||
+ | members = dirk@client dirk@workstation</ | ||
+ | |||
+ | Danach uebertraegt man die neue Konfiguration auf den Server. | ||
+ | |||
+ | <code bash>$ git commit -a -m " | ||
+ | [master 8a62406] playground erzeugt | ||
+ | 1 files changed, 4 insertions(+), | ||
+ | |||
+ | $ git push | ||
+ | Counting objects: 5, done. | ||
+ | Delta compression using up to 4 threads. | ||
+ | Compressing objects: 100% (3/3), done. | ||
+ | Writing objects: 100% (3/3), 375 bytes, done. | ||
+ | Total 3 (delta 0), reused 0 (delta 0) | ||
+ | To gitosis@foo: | ||
+ | | ||
+ | |||
+ | Wir initialisieren das Repositories (ebenfalls lokal): | ||
+ | |||
+ | <code bash>$ git clone gitosis@server: | ||
+ | Cloning into playground-server.git... | ||
+ | Initialized empty Git repository in / | ||
+ | warning: You appear to have cloned an empty repository. | ||
+ | |||
+ | $ cd playground-foo.git/ | ||
+ | |||
+ | $ touch foo | ||
+ | |||
+ | $ git add . | ||
+ | |||
+ | $ git commit -m " | ||
+ | [master (root-commit) 8b70e1d] init | ||
+ | 0 files changed, 0 insertions(+), | ||
+ | | ||
+ | |||
+ | $ git push origin master | ||
+ | Counting objects: 3, done. | ||
+ | Writing objects: 100% (3/3), 197 bytes, done. | ||
+ | Total 3 (delta 0), reused 0 (delta 0) | ||
+ | To gitosis@server: | ||
+ | * [new branch] | ||
+ | |||
+ | Nachdem das alles funktioniert, | ||
+ | |||
+ | Subversion nutzt Usernamen um die Commits zu kennzeichnen, | ||
+ | |||
+ | <code bash>$ svn log --xml | grep author | sort -u | perl -pe ' | ||
+ | |||
+ | Mit dem obigen Befehl bekommt man alle Committer aus einem Subversion-Repository, | ||
+ | |||
+ | < | ||
+ | lux = Dirk Deimeke < | ||
+ | user = Vorname Nachname < | ||
+ | |||
+ | Mit dieser Vorarbeit ist es bereits moeglich, das Subversion-Repository zu klonen und zu konvertieren (ACHTUNG: Unterschied zum Buch, bei mir hat die Option '' | ||
+ | |||
+ | <code bash>$ git svn clone http:// | ||
+ | --authors-file=users.txt --no-metadata my_project</ | ||
+ | |||
+ | Jetzt gilt es noch, Aufraeumarbeiten durchzufuehren. Zuerst machen wir aus den Tags von Subversion Git Tags. | ||
+ | |||
+ | <code bash>$ cp -Rf .git/ | ||
+ | $ rm -Rf .git/ | ||
+ | |||
+ | Als naechstes machen wir aus den remote Referenzen lokale Branches: | ||
+ | |||
+ | <code bash>$ cp -Rf .git/ | ||
+ | $ rm -Rf .git/ | ||
+ | |||
+ | So, jetzt muessen wir das ganze noch hochladen. | ||
+ | |||
+ | <code bash>$ git remote add origin git@my-git-server: | ||
+ | |||
+ | Und, weil wir alles uebertragen wollen, geht es mit dem folgenden Kommando los: | ||
+ | |||
+ | <code bash>$ git push origin --all</ | ||
+ | |||
+ | Fertig! | ||
+ | |||
+ | Ich hatte bei der Migration mit einem groesseren Problem zu kaempfen. Mein privates Repository hat ueber 2000 commits und einige Gigabytes an Daten. Das hat meinen lokalen Rechner in die Knie gezwungen, da waren 4 GB Speicher zu knapp. Ich habe die Migration kurzerhand auf einem Server mit 8 GB RAM laufen lassen, das ging. Alternativ dazu kann man aber mit '' | ||
+ | |||
+ | Es gibt einen sehr guten [[http:// | ||
+ | |||
+ | * git clone ersetzt svn checkout | ||
+ | * git pull ersetzt svn update | ||
+ | * git add mach das gleiche wie svn add | ||
+ | * git commit -a (oder git commit -am) ersetzt svn commit bzw. svn commit -m | ||
+ | * UNTERSCHIED: | ||
+ | |||
+ | |||
+ | [[adminstoriesartikel|Zurück zur Uebersicht]] |