What for ?

This is mostly a reminder for mysef about the way of dumping and loading subversion repositories.

Let’s say I have two subversion repositories. repoA and repoB. I got a component called P at the root of repoA as below:

repoA /
P /
trunk /
branches /
tags /

What I’d like todo is to copy P from repoA to repoB preserving all the history logs for P.

Dumping the repository

Let’s say I started the developement of P with revision 28000 and my last checkin related to P is at revision 38000. The revision numbers are important because it will decrease the needed time to dump the actual svn repository. Less revisions to dump means less time needed :)

We will use svnadmin to do that.

Go on the server hosting the subversion repository and dump it this way:

$ svnadmin dump --quiet --revision 28000:38000 /home/svn/repoA > repoA.dump

This operation can last a while depending on the size of your repository.

svnadmin dump options :

$ svnadmin dump --help
dump: usage: svnadmin dump REPOS_PATH [-r LOWER[:UPPER] ] [--incremental]
Dump the contents of filesystem to stdout in a 'dumpfile'
portable format, sending feedback to stderr. Dump revisions
LOWER rev through UPPER rev. If no revisions are given, dump all
revision trees. If only LOWER is given, dump that one revision tree.
If --incremental is passed, then the first revision dumped will be
a diff against the previous revision, instead of the usual fulltext.
Valid options:
-r [--revision] arg : specify revision number ARG (or X:Y range)
--incremental  : dump incrementally
--deltas   : use deltas in dump output
-q [--quiet]  : no progress (only errors) to stderr

Filtering P component from repoA’s dump

What we are interested in here is only component P. We need to filter out for P component. We will use svndumpfilter to do that.

$ cat repoA.dump | svndumpfilter include P > P.dump

svndumpfilter options:

$ svndumpfilter --help
general usage: svndumpfilter SUBCOMMAND [ARGS & OPTIONS ...]
Type 'svndumpfilter help <subcommand>' for help on a specific subcommand.
Available subcommands:
help (?, h)

Loading back P dump to repoB

Now go on the server hosting repoB. Before that, transfer your P.dump to this server. We will use svnadmin to load it back

$ svnadmin load --quiet /home/svn/repoB < P.dump

svnadmin load options:

$ svnadmin load --help
load: usage: svnadmin load REPOS_PATH
Read a 'dumpfile'-formatted stream from stdin, committing
new revisions into the repository's filesystem. If the repository
was previously empty, its UUID will, by default, be changed to the
one specified in the stream. Progress feedback is sent to stdout.
Valid options:
-q [--quiet]  : no progress (only errors) to stderr
--ignore-uuid  : ignore any repos UUID found in the stream
--force-uuid  : set repos UUID to that found in stream, if any
--use-pre-commit-hook : call pre-commit hook before committing revisions
--use-post-commit-hook : call post-commit hook after committing revisions
--parent-dir arg  : load at specified directory in repository

Here we are. You just need to remove P from repoA:

$ svn remove http://svn.foo.com/repoA/P

Of course, what would be really cool, instead of the dump/load operations, would be something like that being possible in between foreign repositories:

$ svn move https://svn.foo.com/repoA/P https://svn.foo.com/repoB/

Thanks Florent for the pointers.

(Post originally written by Julien Anguenot on the old Nuxeo blogs.)

For information about the Nuxeo Platform, please visit our product page or request a custom demo to see how we can help your organization.