Merging SVN repos while retaining history

Here is a quick little how-to on merging separate Subversion (SVN) repositories into one, while keeping the history in tact. Note that the checkin ID's will change, but you do have a little control over how Subversion will show the change logs.

For this tutorial, we want to merge:

old1, old2, old3 and old4

into a new single repository called

newrepo

First you will need to create a temporary directory to do the work in. You must have enough space in this directory to handle at least two times the current size of your repository.

We will, for the purposes of this Subversion Tutorial, be working in /home/temp/.

cd /home/temp
mkdir svnworking

Now lets move over to our subversion repository and create the new repository that will house our final merged repository:

cd /home/vhost/home/svn/repositories
svnadmin create newrepos
chown -R apache: newrepos

The next step is to create root folders in our new 'newrepo' SVN repository. You want to create one new root folder for each repository that you will be merging in:

svn mkdir -m "Initial project Root Folders" \
file://home/vhost/home/svn/repositories/newrepo/old1 \
file://home/vhost/home/svn/repositories/newrepo/old2 \
file://home/vhost/home/svn/repositories/newrepo/old3 \
file://home/vhost/home/svn/repositories/newrepo/old4

Note: the backslashes are there to allow me to split command onto separate lines. If you plan on putting the command to create the root repos onto one line, then don't use the backslashes.

The next step is to disable Subversion, which will vary depending on how you have it setup. Once the SVN repository is turned off, we are ready to dump the contents of all our Subversion repositories to our temporary location we created above.

svnadmin dump old1 > /home/temp/svnworking/old1.repos
svnadmin dump old2 > /home/temp/svnworking/old2.repos
svnadmin dump old3 > /home/temp/svnworking/old3.repos
svnadmin dump old4 > /home/temp/svnworking/old4.repos

Depending on how large your repositories are, the dumping process could take awhile to process. Once it is complete, the last step is to simply reload your dumped repositories in the order that you want to maintain the update messages.

In your old repositories you theoretically had each repository check-in number starting at 1 and sequentially going up from there. When you remerge the repositories, you can only have a single first check-in. In our example we will re-merge the repositories in this order: old1, old4, old2 and finally old3. Lets assume for a moment that old1 had 100 check-ins, old2 had 54 check-ins, old3 had 1004 check-ins and old4 had 5 check-ins.

Once our merger is complete our check-in numbers will now go like this:

old1 will start at 1 and finish at 100.
old4 will start at 101 and finish at 105
old2 will start at 106 and finish at 159
old3 will start at 160 and finish at 1163

svnadmin load /home/vhost/home/svn/repositories/newrepos --parent-dir old1 < /home/temp/svnworking/old1.repos
svnadmin load /home/vhost/home/svn/repositories/newrepos --parent-dir old4 < /home/temp/svnworking/old4.repos
svnadmin load /home/vhost/home/svn/repositories/newrepos --parent-dir old2 < /home/temp/svnworking/old2.repos
svnadmin load /home/vhost/home/svn/repositories/newrepos --parent-dir old3 < /home/temp/svnworking/old3.repos

Feel free to ask questions or suggest modifications to my method posted here. Due to my schedule I may not be able to respond very quickly. If you require further assistance right away with your Subversion Repositories, please visit http://www.subversion.tigris.org/

Comments