Importing history into Subversion

With existing SVN history

For Savannah administrators: here's how to import an SVN repository.

Make sure that SVN is already enabled for the project (under Main -> Administer -> Select Features). This will create the svn repository with the correct ownership and permissions.

The project developers need to create an SVN dump as explained at SvnImportExistingRepo.

Once the user has provided it, login at Savannah, then use this recipe as a guideline to import the project.

ssh vcs
screen # or whatever, see below
cd /root/vcs-imports
proj=THEIRPROJECT
# get their dump file, e.g.:
dumpfile=$proj-dump.bz2
#scp dl.sv.gnu.org:/srv/download/$proj/$dumpfile .
# or whatever they give, e.g.,
#wget http://url/to/$dumpfile
bzcat $dumpfile | nice -19 svnadmin load /srv/svn/$proj/ >/tmp/$proj.svimport.out 2>/tmp/$proj.svimport.err
tail /tmp/$proj.svimport.err
tail /tmp/$proj.svimport.out
#rm $dumpfile # when disk gets low ...

Sometimes we may be given a tar of their svn repository. In this case, we must ask for a proper svn dump (produced by svnadmin dump). Using a direct tar is not safe because we may not be using the same versions of SVN, and sometimes the format changes with the new versions of SVN.

The svnadmin load is machine intensive and time consuming; it can easily take several seconds per revision. Meaning that this import might easily take several hours to load on a project with any significant history. Planning accordingly by running the task under a screen session, or using nohup, or some such, so that it can complete even if your connection to it is dropped is a good idea.

If converting from another version control system on Savannah then as a final step the prior system should be disabled to prevent further commit access there, see for example CvsDisabling.

Manually creating a Subversion repository

If as a root admin you manually create a Subversion repository then the files will be set to user:group root:root and the permissions will be restricted by the root umask 022. These will need to be converted to the project group and permissions.

proj=THEIRPROJECTID
svnadmin create /srv/svn/$proj
find /srv/svn/$proj/db -type d -exec chmod g+ws {} +
find /srv/svn/$proj/db -type d -exec chgrp $proj {} +
find /srv/svn/$proj/db -type f -exec chgrp $proj {} +

In particular, be sure to leave the hooks directory (along with the others) owned by root:root and able to be written by root. Whereas the db directory should be group-writable by the project.

These steps are all done automatically when the repository is created through the project web interface.