Unleash your inner root

Moving Multiple SVN Repositories

In a perfect world we’d all be using git for our project management. (for those asking why, I won’t dignify that with a response, git is just better, git with the times already. Just kidding, git isn’t BETTER, its just…better.) The problem is, we don’t live in a perfect world. Sometimes, you have to use svn. Sometimes you might even have to use cvs, to those in that boat: I issue my sincerest apologies, I’m wrestling with some CVS issues currently and it makes me hate the world.

Point being, you may in fact be in a position where you have to move your old SVN server to a new server, in my case I was going from a very old timey Solaris install…Fun times.

Now moving a single SVN repository is easy, its as easy as 1,2

svadmin dump /path/to/repository > /path/to/destination/file.svn

Followed by:

svadmin create /path/to/new/repository
svnadmin load /path/to/new/repository < /path/to/backup/file.svn

And you are done!

However, depending on how the programmers that use your svn repository did their thing, it is quite possible you may have 10, 20, 50, 100 repositories that all need to be moved. Obviously you aren’t going to want to by hand do a dump of each repository, that would be crazy…and a waste of your time as an admin. Always remember, there are two types of lazy admins: Those that are lazy because they are lazy, and those that are lazy because they are so smart they’ve made their job so easy that one of the other types of lazy admins could do it. Always try to be an admin that creates a lazy job for some other admin, never be the lazy admin that leaves more work for another admin to do, because that creates a third type of admin: the admin that wants to kill himself because the admin that came before him was an idiot.

Here are two scripts to make things easier, the first one will export a directory full of svn repositories in a way that can be easily tar’ed and gziped and moved, and the second, will make new repositories for your svn server. Change your Variable paths as necessary.

And of course here is the github project with these scripts to save you the trouble of copy/pasting these scripts manually. Enjoy.

#!/bin/bash
# svn-export.sh
# AUTHOR       : Brandon M. Graves
# DATE CREATED : 20JAN2016
# LAST MODIFIED: 20JAN2016


# REPOS Should be a path to where your SVN repositories are currently located.
REPOS=/var/svn

#DESTINATION is where the backups should end up.
DESTINATION=/home/metauser/svn-backup

# SVNAUTH is the location of the user file for SVN. Included is the RHEL 6 default
$SVNAUTH="/etc/svn-auth-conf"

# SVNACCESS is the location of the access/groups file to determine what svn users have access
# to what repositories at what levels. Include is the configuration I use in my environment, this can be changed
$SVNACCESS="svn/svn-admin/svnauthz.conf"

for x in $REPOS/*; do
    test -d "$REPOS/$x"  &&  svnadmin dump "$x" >"$DESTINATION/$x.svn"
done

cp $SVNAUTH $DESTINATION/
cp $SVNACCESS $DESTINATION/
#!/bin/bash
# svn-import.sh
# AUTHOR       : Brandon M. Graves
# DATE CREATED : 20JAN2016
# LAST MODIFIED: 20JAN2016
#SVNPATH is the path of your new SVN root location
SVNPATH="/var/svn-new"

#DUMPPATH is the location of the svn-backup.
DUMPPATH="/home/metauser/svn-backup"

# $SVNREPO is the the path you want to run svn on from your server IE https://metashell.net/$SVNREPO/project1
$SVNREPO="/svn"

# SVNCONFIG Determines where the svn repositories are configured in apache, the default for RHEL 6 is the current setting.
$SVNCONFIG="/etc/httpd/conf.d/subversion.conf"

# SVNAUTH is the location of the user file for SVN. Included is the RHEL 6 default
$SVNAUTH="/etc/svn-auth-conf"

# SVNACCESS is the location of the access/groups file to determine what svn users have access
# to what repositories at what levels. Include is the configuration I use in my environment, this can be changed
$SVNACCESS="svn/svn-admin/svnauthz.conf"

# This should move the SVN User/group files to the correct place.
mv $DUMPPATH/$(basename $SVNAUTH) $SVNAUTH
mv $DUMPPATH/$(basename $SVNACESS) $SVNACESS

cd "$SVNPATH"
for x in $DUMPPATH/*; do
        REPO=$(basename $x .svn)
        svnadmin create $SVNPATH/$REPO
        svnadmin load $SVNPATH/$REPO < $x


echo '<pre>' >> $SVNCONFIG
echo '<Location $SVNREPO/$REPO>' >> $SVNCONFIG
echo '        DAV svn' >> $SVNCONFIG
echo '        SVNPath $SVNPATH/$REPO' >> $SVNCONFIG
echo '        AuthType Basic' >> $SVNCONFIG
echo '        AuthName "Repository: $REPO"' >> $SVNCONFIG
echo '        AuthzLDAPAuthoritative on' >> $SVNCONFIG
echo '        AuthUserFile $SVNAUTH' >> $SVNCONFIG
echo '        Require valid-user' >> $SVNCONFIG
echo '        AuthzSVNAccessFile /svn/svn-admin/svnauthz.conf' >> $SVNCONFIG
echo '        Allow from all' >> $SVNCONFIG
echo '</Location>' >> $SVNCONFIG
done

chown -R apache.apache $SVNPATH
service httpd restart

scriptsvnsvn migration

Brandon.Graves • January 24, 2016


Previous Post

Next Post

Leave a Reply

Your email address will not be published / Required fields are marked *

%d bloggers like this: