Für einige Einsatzzwecke ist es erforderlich, ein komplettes Subversion-Repository zu spiegeln. Ein gutes Beispiel hierfür ist Trac, welches zumindest nach meinem Kenntnisstand derzeit nur auf lokale Repositories zugreifen kann.
Anstatt nun den gesamten Verzeichnisinhalt etwa per rsync synchon zu halten bietet es sich an, direkt auf Ebene des Subversion-Protokolls zu spiegeln. Dazu dient das Programm svnsync, welches in den Subversion-Pakete der meisten Distributionen enthalten sein sollte.
Im Folgenden wird davon ausgegangen, dass das entfernte Repository unter der Adresse http://example.com/svn verfügbar ist und ein Zugriff mit dem Benutzernamen svnsync möglich ist. Das Zielrepository soll in diesem Fall l0kal unter dem Pfad /srv/svnMirror vorliegen. Da Subversion die Protokolle transparent handhabt sollten auch beliebige Kombinationen mit http(s), ssh und file möglich sein.
Zunächst muss das lokale Repository mit leerem Inhalt angelegt werden:
svnadmin create /srv/svnMirror
Anschließend hat man die Wahl: Sofern aus das gespiegelte Repository keine weiteren Benutzer als der svnsync-Benutzer zugreifen, kann man gefahrlos die folgenden beiden Kommandos ausführen:
echo "#!/bin/bash" > /srv/svnMirror/hooks/pre-revprop-change
chmod u+x /srv/svnMirror/hooks/pre-revprop-change
Allerdings haben in diesem Fall alle Benutzer einen Vollzugriff auf das Verzeichnis, können insbesondere auch Revisionen löschen. Sofern also weitere Benutzer Zugriff auf die Kopie erhalten soll, empfiehlt es sich, die folgenden Zeilen in die Datei /srv/svnMirror/hooks/pre-revprop-change einzutragen und diese anschließend ausführbar zu machen:
#!/bin/sh
USER="$3"
if [ "$USER" = "svnsync" ]; then exit 0; fi
echo "Only the svnsync user can change revprops" >&2
exit 1
Mit dieser Kombination erhält nur der Benutzer svnsync den Vollzugriff.
Wie auch immer man sich entschieden hat, anschließend erfolgt eine initiale Synchronisation, hier muss man unter anderem das Passwort für den Zugriff eingeben:
svnsync init --username=svnsync /srv/svnMirror
Anschließend stößt man den Synchronisationsvorgang mit folgendem Befehl an:
svnsync /srv/svnMirror
Die erste Synchronisation kann, je nach Alter und Größe des entfernten Repositories, einige Zeit in Anspruch nehmen, da jede einzelne Revision sukzessive kopiert werden.
Auch für jede weitere Kopiervorgang benutzt man nun das obige Kommando, es empfiehlt sich in den meisten Fällen, dies in einen Cronjob einzutragen.