How do I back up a remote SVN repository
Solution 1:
Just use the svnsync command.
First, create a fresh repository on your home machine.
svnadmin create c:\backuprepo
Or on Unix:
svnadmin create ./backuprepo
Next, create a file named pre-revprop-change.bat:
echo exit 0 > c:\backuprepo\hooks\pre-revprop-change.bat
Or on Unix:
echo -ne '#!/bin/sh\nexit 0' > ./backuprepo/hooks/pre-revprop-change
chmod ugo+x ./backuprepo/hooks/pre-revprop-change
then, initialize the sync:
svnsync init file:///c:/backuprepo https://url/of/your/repository
Or on Unix:
svnsync init file:///Volumes/volumelabel/backuprepo https://url/of/your/repository
After that, you can simply run
svnsync sync file:///c:/backuprepo
once a day or so, and you'll get only those changes which are not yet in your backup repository. The first time it will take a while, but after you've synchronized your backup repository with the real one, it will only take a few seconds to sync it because only those revisions that are new need to be synched.
Solution 2:
As of subversion 1.7, you can also use the new command svnrdump
. From the docs:
Dump—that is, generate a repository dump stream of—revisions of the repository item located at SOURCE_URL, printing the information to standard output.
Usage would be:
svnrdump dump http://example.com/repos/ > repos.dump
This creates a "dump file" of the repository in repos.dump
. This is a complete backup of your repository data including history, but is not directly readable by a subversion client. If you need to restore this data, use the standard svnadmin
tools:
svnadmin create c:\backup-repos
svnadmin load c:\backup-repos < repos.dump
Haven't done any testing, but this might end up being slower than svnsync
. svnrdump
will do a complete dump of the repository everytime, where I'm assuming synsync
will only import changes in the repository since the last time it was run. You will have a single file containing your entire repository though, which may or may not be easier to manage.
Note that you may want to pipe the output of svnrdump
through gzip
or similar program to possibly significantly reduce the size of the outputted file.
Solution 3:
create your local repository
svnadmin create /Users/jsmith/repo
create an empty pre-revprop-change hook script
echo '#!/bin/bash' > /Users/jsmith/repo/hooks/pre-revprop-change
make the pre-revprop-change hook script executable
chmod +x /Users/jsmith/backup/hooks/pre-revprop-change
initialize svnsync
svnsync init file:////Users/jsmith/repo https://www.smith.com/repo
synchronize repos
svnsync sync file:////Users/jsmith/repo
Solution 4:
rsync (or DeltaCopy which is a Windows UI on top of it) would be a good choice to incrementally copy the complete repository at the filesystem level.
You can also use svnsync to copy new revisions directly from one SVN server to another.
Solution 5:
You can use a script on a remote server which dumps the repository, then copies it to your local computer (or leaves it in a predefined location for your local computer to copy)
You can either sync the backup directories with rsync or scp.
The script can be run with "Scheduled Tasks" and can produce uniquely named backup files, which will later by synced in the above mentioned way by your local computer. (and then possibly deleted)