Spesso si ha necessità di avere una o più copie di un repository Subversion su una macchina remota.
In tali occasioni ci viene in aiuto l'utilissimo tool svnsync. Tale software è installato di default insieme al server SVN ma la sua documentazione è lacunosa.
Supponiamo di avere un repository SVN già funzionante che risponde all'URL
svn://10.0.0.1/repository
e di voler creare un mirror. Supponiamo anche che sul repository appena indicato esista un utente con username svnsync.
Installiamo Subversion sulla macchina mirror (supponiamo di voler mettere il repository nella cartella /svn-mirror). Se siamo sotto Ubuntu basta lanciare il comando:
sudo apt-get install subversion
mentre sotto FreeBSD eseguiamo:
cd /usr/ports/devel/subversion make make install make clean
Maggiori informazioni sull'installazione sono reperibili qui.
Procediamo, prima creando il repository mirror
svnadmin create /svn-mirror
poi creiamo un hook che faccia in modo che solo l'utente svnsync possa fare commit sul repository (di fatto lo stiamo rendere un repository a solo lettura - quasi):
cat <<'EOF' > /svn-mirror/hooks/pre-revprop-change #!/bin/sh USER="$3" if [ "$USER" = "svnsync" ]; then exit 0; fi echo "Questa operazione puo' essere eseguita\ solo dall'utente svnsync" >&2 exit 1 EOF
rendiamo l'hook eseguibile:
chmod a+x /svn-mirror/hooks/pre-revprop-change
a questo punto eseguiamo la prima sincronizzazione tra il repository originale ed il mirror
svnsync init --username svnsync \ file:///svn-mirror svn://10.0.0.1/repository svnsync sync --username svnsync file:///svn-mirror
Da questo momento in poi basterà eseguire periodicamente (ad esempio configurandolo nel cron) il seguente comando per far in modo che il mirror si sincronizzi con il repository principale:
svnsync sync --username svnsync file:///svn-mirror
Da notare che sul repository principale non è stato necessario eseguire nessuna operazione se non l'aggiunta dell'utente svnsync. In realtà potreste tranquillamente usare un qualsiasi altro utente valido (in tal caso cambiate il nome utente in tutti i comandi indicati fino ad ora).
Nota 1: per maggiori informazioni sull'amministrazione di un repository SVN vi consiglio di consultare l'ottimo manuale reperibile all'url http://svnbook.red-bean.com/
Nota 2: se quello che serve è semplicemente una copia di backup di un repository ed il repository non è troppo grosso (in termini di spazio occupato) è possibile eseguire un più semplice svnadmin hotcopy. Maggiori informazioni qui.
Nota 3: se il vosto repository mirror è esposto in rete tramite svnserve, ricordatevi di lanciare il demone con l'opzione -R in modo da assicurarvi che nessuno possa effettuare dei commit e desincronizzare quindi il mirror dal repository master.