Remote Backup Of A Subversion (svn) Repository
Yesterday I spent a lot of time trying to figure out how to take a complete backup of a subversion repository containing some code that I am currently working on. The generic way to do this is
svnadmin dump path-to-repos
but svnadmin only works on local repositories. However, I do not have shell access to the machine containing the repository and can only access it through its webDAV interface. I thought that since all revision information is available through the normal svn client, someone would have solved this problem nicely already. I googled around and could not find any obvious solutions. I found a the source to a program, svn-push in the subversion repository contrib section. It is a bit unclear what this program actually does and I was unable to actually make it compile. After some more searching I stumbled acroos svk which is a program build on top of subversion. Eventually I found out that I could abuse this program to create a dump of my remote repository. First make sure that you have no previous svk history:
rm -rf ~/.svk
Then get information of the repository by issuing the following command and follow the instructions on screen
svk ls [subversion-repository-URL]
svk should then have built a local repository, the first two revisions to this are local svk information, we simply dump the rest:
svnadmin dump -r2:HEAD ~/.svk/local > my-repository-dump
If you have stored the repository with the same name as you original repository as part of the “ls” command, my-repository-dump should now contain the full revision and log information of the original remote repository. yay.
Many thanks!
It saved me from a very bugging situation which blocked my repository :-)
I had exactly the same problem and ended up writing a small command line tool on top of the Subversion API that can dump a repository by accessing it via WebDAV or the svn:// protocol.
Maybe it will be useful for others, too: http://saubue.boolsoft.org/projects/rsvndump
That is a neat solution, sounds more elegant than my approach :)
I stumbled across another approach while trying to implement yours.
~$ svnsync help initialize
initialize (init): usage: svnsync initialize DEST_URL SOURCE_URL
Initialize a destination repository for synchronization from
another repository.
The destination URL must point to the root of a repository with
no committed revisions. The destination repository must allow
revision property changes.
If the source URL is not the root of a repository, only the
specified part of the repository will be synchronized.
You should not commit to, or make revision property changes in,
the destination repository by any method other than ‘svnsync’.
In other words, the destination repository should be a read-only
mirror of the source repository.
Valid options:
–non-interactive : do no interactive prompting
–no-auth-cache : do not cache authentication tokens
–username ARG : specify a username ARG (deprecated;
see –source-username and –sync-username)
–password ARG : specify a password ARG (deprecated;
see –source-password and –sync-password)
–trust-server-cert : accept unknown SSL server certificates without
prompting (but only with ‘–non-interactive’)
–source-username ARG : connect to source repository with username ARG
–source-password ARG : connect to source repository with password ARG
–sync-username ARG : connect to sync repository with username ARG
–sync-password ARG : connect to sync repository with password ARG
–config-dir ARG : read user configuration files from directory ARG
-q [--quiet] : print as little as possible
~$ rpm -q –whatprovides $(which svnsync)
subversion-1.6.2-1.el5.rf