Mit svnsync
läßt sich ein remote Repository zur Datensicherung (u.a.) auf die eigene Platte übertragen. Die dafür notwendigen Schtte in der richtigen Reihenfolge mit der richtigen Syntax der URLs, Pfade usw. können einem aber schon zu schaffen machen, darum hier wieder mal ein „so hat's bei mir geklappt“:
mkdir skds-script-repository
svnadmin create skds_repository_svnsync/
Achtung: Voller Pfad mit 3! / hinter file: !
svn info file:///mnt/smbdata/Server_Backups/skds-script-repository/skds_repository_svnsync
gedit skds_repository_svnsync/hooks/pre-revprop-change
containing
#!/bin/sh USER="$3" if [ "$USER" = "stko" ]; then exit 0; fi echo "Only the svnsync user can change revprops" >&2 exit 1
Ausführbar machen
chmod +x skds_repository_svnsync/hooks/pre-revprop-change
Lokales Repository initialisieren:
svnsync init --username stko file:///mnt/smbdata/Server_Backups/skds-script-repository/skds_repository_svnsync https://svn2.hosted-projects.com/stko/skdsscripts
mit der Rückmeldung
Eigenschaften für Revision 0 kopiert.
Dann kommt der eigentliche Kopiervorgang:
svnsync sync --username stko file:///mnt/smbdata/Server_Backups/skds-script-repository/skds_repository_svnsync
Und am Ende transferiert man die Repository- Struktur noch in ein Dump- File:
svnadmin dump skds_repository_svnsync/ > skds_repository_svnsync.dvndump
Wechselt man den Provider, dann muß das SVN- Repository ja irgendwie vom alten zum neuen Provider rübergeschaufelt werden. Hier mal am Beispiel von SourceForge zu GoogleCode: 1)
svnadmin create /home/steffen/SF_Svn_Backup svnsync init --username stko https://oobd.svn.sourceforge.net/svnroot/oobd file:///home/steffen/SF_Svn_Backup svnsync sync --username stko https://oobd.svn.sourceforge.net/svnroot/oobd joe /home/steffen/SF_Svn_Backup/hooks/pre-revprop-change # make it 'exit 0' chmod +x /home/steffen/SF_Svn_Backup/hooks/pre-revprop-change svnsync init --username steffen.koehlers.de@gmail.com file:///home/steffen/SF_Svn_Backup https://oobd.googlecode.com/svn svnsync sync --username steffen.koehlers.de@gmail.com file:///home/steffen/SF_Svn_Backup
Falls die Übertragung mal abbrechen sollte, muß man erst wieder den Transfer-Lock löschen, bevor man weitermachen kann („Couldn't get lock on destination repos“):
svn proplist --revprop -r0 https://oobd.googlecode.com/svn
Das Wichtigste am Anfang: Auf den neuen Server umstellen mit dem bekannten SVN Befehl „relocate repository URL“ geht nicht!. Der funktioniert nämlich nur dann, wenn der alte Server sich verschoben hat. Ein neu aufgelegter Server dagegen hat eine andere ID als der Alte, und das mag SVN dann gar nicht…
Statt dessen geht das z.B. so:
.svn
heissen. Wichtig: Wirklich alle löschen!So gehen nämlich z.B. lokale Config- Dateien und bereits gemachte Änderungen nicht verloren, die ja natürlich nicht im frisch downgeloadeten Repository enthalten sind.
Das war die händische Anleitung für alle Windows-Abhängigen. Unter Unix geht natürlich auch das etwas einfacher, auch hier wieder exemplarisch für ein GoogleCode- Repository. Das Script wird mit dem GoogleAccount als Parameter aufgerufen.
Aber vor dem Script erst doch noch die alten Daten sichern
cp -r oobd oobd_orig
Dann kommt das Script:
mv oobd oobd_SF_old svn checkout https://oobd.googlecode.com/svn/ oobd --username $1 find oobd_SF_old -name ".svn" -exec rm -rf {} \; cp -r oobd_SF_old/* oobd
und Fertig - Jetzt kann man in der neuen Arbeitskopie wieder genauso arbeiten wie vorher im Alten
Wenn einen das Schicksal trifft und man muß vom aktbekannten SVN auf Git wechseln, muß man zwei Aspekte beachten: Zum einen natürlich den Übergang vom alten Repository auf das Neue, zum anderen aber auch sollte man nicht vergessen, daß man ja normalerweise in der lokalen svn- Arbeitskopie noch einen Haufen unversionierter Dateien hat, die man zwar einerseits braucht, aber die nichts im Repository zu suchen haben.
Das folgende Script nimmt ein bestehendes SVN- Repository, legt davon ein Backup an, checkt stattdessen das neue bereits bestehende GIT- Repository unter dem gleichen Namen aus und kopiert die ganzen unversionierten Dateien aus dem alten SVN- ins Git- Repository.
#!/bin/bash function runcommand { "$@" local status=$? if [ $status -ne 0 ]; then echo "error with $1" >&2 fi return $status } PROGRAMNAME=$(basename $0) if [ $# -ne 2 ] ; then echo "Usage $PROGRAMNAME <gitusername> <svndirname>" echo "$PROGRAMNAME creates a <svndirname>_svnbackup Dir" echo "and a <svndirname>_unversioned Dir" echo "then it clones your Github repository by 'clone https://github.com/<gitusername>/<svndirname>.git'" echo "and finally copies all unversioned files from the old svn data into the new git directory" exit fi if [ -d $2_svnbackup ] ; then echo "$2_svnbackup does already exist !" echo "Did the program maybe run before? Please check before try $PROGRAMNAME again" exit fi if [ -d $2_unversioned ] ; then echo "$2_unversioned does already exist." echo "For security, this need to be removed manually before try $PROGRAMNAME again" exit fi echo "Create directory copies:" runcommand cp -r $2 $2_unversioned runcommand mv $2 $2_svnbackup echo "Clone repostitory:" runcommand git clone https://github.com/$1/$2.git echo "remove svn artifacts:" runcommand cd $2_unversioned runcommand svn list -R | xargs rm find . -name ".svn" -exec rm -rf {} \; 2>/dev/null runcommand cd .. echo "copy remaining unversioned files into new git repository:" runcommand cp -r $2_unversioned/* $2 echo "Check results between old svn directory and new git repository:" diff -r -q $2_svnbackup $2