Subversion-Erfahrungen und SVN-Repository Backup

Es war nun endlich an der Zeit von CVS auf Subversion umzusteigen. Besonders in Hinblick auf die kommende Lotus Notes Designer Erweiterung, die es endlich ermöglicht, Designelemente in ein Versionierungssystem ein- und auszuchecken. Dazu aber in einem gesonderten Artikel mehr. Als erstes habe ich alle bestehenden CVS-Repositories genommen und mittels CVS2SVNkonvertiert. Das hat auch hervorragend geklappt. Das CVS2SVN läßt sich recht einfach wie folgt aufrufen:

cvs2svn --svnrepos <<Ziel-Pfad zum SVN-Repos.>> <<Quell-Pfad des CVS-Repos.>>

Dieser Aufruf klappte auch schon wunderbar. Allerdings gab es einige Probleme mit deutschen Umlauten in den Commit-Logs des CVS. Warnungen waren daher in den Repositories an der Tagesordnung. Dafür schafft ein weiterer Parameter Abhilfe mit dem ich das Encoding des Repositories explizit angegeben habe. Zur Sicherheit habe ich das fallback-encoding auch noch angegeben.

cvs2svn --svnrepos <<Ziel-Pfad zum SVN-Repos.>> <<Quell-Pfad des CVS-Repos.>>
 --encoding=latin_1  --fallback-encoding=latin_1

Damit ließen sich dann die CVS-Repositories sehr schnell konvertieren. Sobald sie in den Subversion-Repository-Pfad gestellt wurden, waren diese auch wieder von allen anderen erreichbar.   Nachdem ich nun meine Subversion-Repositories hatte, kam noch ein Wunsch auf. Aktuell arbeite ich, neben Projekten auf dem PC, auch an einem Hobby-Projekt. Es geht darum ein PC-Spiel für einen alten ATARI XL/XE (1,79 MHz, 64 KB!) umzusetzen. Auch auf diesem nostalgischem System ging die Entwicklung weiter. Mittlerweile werden die meisten Programme dafür nicht mehr auf dem kleinen Home-Computer geschrieben, sondern in einer richtigen Entwicklungsumgebung unter Windows oder Linux (dazu hat Creature XL einen interessanten Artikel in seinem Blog verfasst). Subversion oder andere Versionierungssysteme werden dabei auch gern genutzt. Wir haben für unser Spiel daher auch ein SVN-Repository. Um zu verhindern, dass wir nicht mehr an den Code kommen, weil der Server nicht erreichbar ist, haben wir uns entschlossen, das Repository zu spiegeln. Creature XL hat einen Server und ich habe einen Server. Das paßte sich ganze gut. Auf dem Server von Creature XL befindet sich das Hauptrepository, welches mein Server spiegeln sollte. Ich habe dafür als erstes einen neuen User angelegt, der nur für das spiegeln zuständig ist. Per gerechneten und ausgetauschten Keys kann sich der User an dem anderen Server ohne Kennwort anmelden. Als erstes muss auf dem Spiegel-Server nun ein neues SVN-Repository angelegt werden:

svnadmin create /srv/svn/repo_name

Hier befindet sich nun ein neues leeres Repository. Damit das Repository vorerst nur vom SVN-Spiegel-User benutzbar ist, müssen noch folgende Zeilen in die Datei  /srv/svn/repo_name/hooks/pre-revprop-change eingetragen werden. Damit sichern wir das Repository vor anderen Server-Usern ab.

#!/bin/sh
USER="$3"
if [ "$USER" = "svnsync" ]; then exit 0; fi
echo "Only the svnsync user can change revprops" >&2
exit 1

Als nächstes muss einmal eine initiale Syncronisation durchgeführt werden, damit sich beide Repositories das erste Mal abgleichen können.

svnsync init file:////srv/svn/repo_name svn+ssh://user@quellserver/srv/var/repo_name

Als nächstes muss die eigentliche Syncronisation der Repositories aufgerufen werden. Auch dies funktioniert mit einem Befehl:

svnsync sync file:///srv/svn/repo_name

Da sich hier die Repositories durch das Initial-Sync schon kennen, muss der Quell-Server nicht mehr angegeben werden. Damit der Abgleich der Subversion-Repositories nicht immer per Hand durchgeführt werden muss, habe ich den svnsync-Befehl in die Crontab per crontab -e mit aufgenommen. Damit findet stündlich ein Abgleich statt:

0 * * * * svnsync sync file:///srv/svn/repo_name

Eine weitere Idee entstand dabei. Es wäre schön, wenn wir das Repository per Browser durchsuchen könnten. Dafür existiert das Projekt „WebSVN„, welches sich unter Debian sehr einfach per apt-get install websvn installieren läßt. Es handelt sich um eine PHP-Anwendung, die sich alternativ aber auch einfach in ein Apache-Webverzeichnis extrahieren läßt. Zwei Anpassungen habe ich dabei noch durchgeführt. Zum einen wollte ich nicht, dass jeder den Code der Repositories sehen kann. Eine Anmeldung sollte her. Dafür nutze ich die Standard-Authentifizierung des Apache. Ich habe als erstes ein neues Passwort-File erzeugt:

htpasswd -cm /etc/apache2/dav_svn.passwd user1

Der Befehl fragt anschließend das Passwort ab und erzeugt eine Hash-Datei unter /etc/apache2/dav_svn.passwd. Weitere User können zu der Datei hinzugefügt werden. Dies funktioniert mit dem gleichen Befehl, allerdings ohne die -c Option, da diese immer eine neue Datei erstellt.

htpasswd -m /etc/apache2/dav_svn.passwd user2

Nun wird die Passwort-Datei dem DAV-Zugriff bekannt gemacht: In die Datei /etc/apache2/mods-enabled/dav_svn.conf oder einer .htaccess Datei werden folgende Zeilen benötigt:

AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /etc/apache2/dav_svn.passwd
AuthzSVNAccessFile /etc/apache2/dav_svn.authz

Als zweite Anforderung werden nun alle Repositories des Servers angezeigt. Hier soll aber nur momentan unser aktuelles Projekt angezeigt werden. Dafür können einige Anpassungen in der Datei /etc/websvn/svn_deb.conf durchgeführt werden. Wenn mindestens ein Repository bereits auf dem Server existiert, kann die folgende Zeile auskommentiert werden. Diese zeigt nur ein Beispiel-Repository im Browser an.

// $config->addRepository("repos1", "file:///var/svn/");

Damit wird dieser Eintrag nicht mehr im WebSVN angezeigt, sondern nur noch alle Repositories, die sich auf dem Server befinden. Möchte man nun nur bestimmte Repositories ausgeben, ist folgende Zeile notwendig.

$config->addRepository("atari8", "file:///srv/svn/repo_name");

Damit können bestimmte Repositories, die angezeigt werden sollen, hinzugefügt werden. Für jedes weitere Repository ist diese Zeile einfach zu kopieren. Dennoch werden alle Repositories angezeigt. Grund dafür ist der Config-Parameter parentPath. Dieser sorgt dafür, dass alle Repositories durchsucht werden. Nach dem auskommentieren der folgenden Zeile werden nur noch die Repositories angezeigt, die per ->addRepository hinzugefügt wurden.

//$config->parentPath("/var/svn");

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *