How do I back up a remote SVN repository

SvnBackup

Svn Problem Overview


I am currently moving my SVN server from my home server to my remote server so I can access it more easily from other locations. My remote server is not backed up so I want to regularly back it up to my home server.

Remote server is Windows 2003 server. Home server is Windows Home Server.

What is the best way to do this? can I get my home server to get a dump of the remote server every night? Bandwidth isn't a huge consideration but if I could just copy any new checkins to an SVN server on my home server that would be fine.

Any suggestions welcome.

Svn Solutions


Solution 1 - Svn

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 - Svn

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 - Svn

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 - Svn

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 - Svn

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)

Solution 6 - Svn

EFraim mentioned rsync while I wrote this so that's covered.

If you don't want to work with that, the Subversion Book offers the svnadmin dump --incremental option explained here:

However, to do this successfully, you have to juggle with revision numbers - rsync'ing the raw repository data directories will be easier.

The hard part will probably be setting up rsync so your local and remote machine can communicate securely (i.e. set up an SSH service on the 2003 server). DeltaCopy that Wim mentions is very interesting and would be my first shot; for command line operation only, here is a howto on how to get Rsync running as a service on Windows 2003.

Solution 7 - Svn

I would use either svnsync or svnadmin hotcopy as both of these techniques are guaranteed to copy valid data from the repository, even if a transaction is in progress. Other file synchronisation techniques may not be as reliable, depending upon the repository format.

Solution 8 - Svn

In Mac OS X 10.10, the svnrdump command is located here:

  • /Library/Developer/CommandLineTools/usr/bin/svnrdump

You can then use the answer above by joesdiner.

Solution 9 - Svn

To expand on Stefans answer, here are some windows batch scripts to help automate the process a little.

svn-backup-init.bat

@echo off
set /P directory="Local Directory: "
set /P URL="Svn URL: "
	
echo "Running SVN backup";

@echo on
svnadmin create %directory%
echo exit 0 > %directory%\hooks\pre-revprop-change.bat
svnsync init file:///%directory% %URL%
svnsync sync file:///%directory%**strong text**

This script will create the svn repo, and check it out and do a sync immediately. When you run the script just enter the directory to put the repo locally and the URL of the server to use.

svn-backup-run.bat

for /d %%i in (%~dp0*) do ( svnsync sync file:///%%i ) 

This will loop through each directory and run the svnsync command. If you have multiple repos, check them out into the same folder. This can then easily be added as a Task in windows to update all your repos at once.

Folder Structure

I use a folder structure as such:

.
├── svn-backups
|   ├── repo-1
|   ├── repo-2
|   ├── repo-3
|   ├── svn-backup-init.bat
|   └── svn-backup-run.bat

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRoadersView Question on Stackoverflow
Solution 1 - SvnStefanView Answer on Stackoverflow
Solution 2 - SvnjoesdinerView Answer on Stackoverflow
Solution 3 - SvnyanokwaView Answer on Stackoverflow
Solution 4 - SvnWimView Answer on Stackoverflow
Solution 5 - SvnEFraimView Answer on Stackoverflow
Solution 6 - SvnPekkaView Answer on Stackoverflow
Solution 7 - SvnDamian PowellView Answer on Stackoverflow
Solution 8 - SvnSoftware EngineerView Answer on Stackoverflow
Solution 9 - SvnJoe JankowiakView Answer on Stackoverflow