Copy Your Subversion Repository Using URLs With svnsync

Subversion svnsync copy repositoriesI was recently in a situation when I needed to move my Subversion repository from one server to another. One option was to use “svnadmin dump”, but that requires you to have access to the file system on the server where the repository sits as well as knowing what directory the repository is in. It turns out that a much sleeker way to do this is using the svnsync tool because all you need to know for that solution are the URLs of the source and target repositories. Here’s how:

Let’s say we have a SVN repository and we want to copy it to The following instructions are specific to Ubuntu. For other distros, the process will be similar, though.


First, we’ll create the target repository if it doesn’t exist yet – we’ll call it repo1:

mkdir -p /var/lib/svn/repo1
svnadmin create /var/lib/svn/repo1

Of course, you will need to configure this repository in /etc/apache2/mods-available/dav_svn.conf having DAV installed. Doing that is not the subject of this article, though.


It is necessary to add the pre-revprop-change hook to the target repository because otherwise the repository copying will fail. In our example, we add the hook like this:

echo '#!/bin/sh' > /var/lib/svn/repo1/hooks/pre-revprop-change

Now, let’s make sure the target repository is read/writable by the user running the Apache2 server:

sudo chown -R www-data:www-data /var/lib/svn/repo1

and that the hook is executable:

sudo chmod +x /var/lib/svn/repo1/hooks/pre-revprop-change


Now we are ready to start the repository transfer. In your target repository machine (can be the same machine as the source repository machine, actually, as you can copy repositories locally, too), type the following to initialize the target repository for the transfer (notice that the target repository URL comes first, the source repository second in the command):

svnsync init

And then start the transfer as follows:

svnsync sync

Now all the revisions from the source repository will be copied to the target repository, so it might take a while. The beauty of this is that you can even interrupt the copying by CTRL+C and resume it where it left off later by issuing the last command again.

I hope you will find this useful!

Bookmark the permalink.