Tra i comandi messi a disposizione dalla distribuzione standard di Subversion troviamo svnsync.
svnsync permette di sincronizzare un repository verso uno o più respository.
Per prima cosa è bene sottolineare che svnsync non può essere usato per mantenere un repository distribuito, il repository verso cui avviene la sincronizzazione deve essere in sola lettura, one way.
Subversion è un SCM centralizzato e non permette di configurare repository distribuiti nativamente. Sul mercato sono presenti strumenti che permettono di trasformare Subversion in repository decentralizzato, ad esempio Wandisco.
A partire dalla version 1.5 di svnsync è possibile sincronizzare solo un ramo del repository sorgente verso il repository di destinazione.
Vediamo come utilizzare svnsync tramite protocollo svn:
Consideriamo di avere il nostro repository principale sulla macchina master.example.com disponibile all’indirizzo svn://master.example.com
Sulla macchina slave creiamo il repository target per la sincronizzazione con il master:
root@slave# mkdir /var/lib/svn root@slave# cd /var/lib/svn root@slave# svnadmin create repo
A questo punto dobbiamo preparare il repository target appena creato in modo tale che accetti le modifiche delle revision property. Di default la modifica di tali property è disabilitata su Subversion, essendo le revison property non versionate. Per permettere la modifica delle revision property è sufficiente modificare l’hook pre-revprop-change in modo che termini correttamente (con exit status a 0);
root@slave# cd repo/hooks root@slave# head -n 1 pre-revprop-change.tmpl > pre-revprop-change root@slave# chmod +x pre-revprop-change root@slave# cd ../..
A questo punto utilizziamo svnsync per inizializzare il repository target
root@slave# svnsync init file:///var/lib/svn/repo svn://master.example.com Copied properties for revision 0.
Se analizziamo le revision property del repository target possiamo vedere quali sono le operazioni compiute dal comando init:
root@slave# svnlook proplist repo -r 0 --revprop svn:sync-from-uuid svn:sync-last-merged-rev svn:date svn:sync-from-url
Ora è possibile iniziare la syncronizzazione del repository
root@slave# svnsync sync file:///var/lib/repo
