Extracting a Directory into its Own Subversion Repository
This article was originally published in my blog (affectionately referred to as blargh) on . The original blog no longer exists as I've migrated everything to this wiki.
The original URL of this post was at https://tmont.com/blargh/2009/10/extracting-a-directory-into-its-own-subversion-repository. Hopefully that link redirects back to this page.
Like my previous subversion post, this is something that is a bit difficult to find on the internet.
Every so often, you realize that a project is growing too big, and it deserves its own repository. What you want is to extract a single directory from one repository, and create an entirely new repository that only has the revisions related to that one directory in it. And it would be nice if they started from one. Luckily, subversion provides just such a tool for doing it.
Suppose your repo looks like this:
/foo
/bar
--/src
--/tests
--/www
----/css
----/images
----/js
--/bin
/baz
/bat
and you want to remove the "bar" directory and create a new repository out of it. Here is what you would do:
svnadmin dump /path/to/big/repo > repodump
cat repodump | svndumpfilter include bar --drop-empty-revs --renumber-revs > newrepodump
svnadmin create newrepo
svnadmin load newrepo > newrepodump
You'll probably want to create trunk, tags and branches for your new repo, so you have two choices:
- Try and figure out how to modify the dump file and delete the proper nodes (impossible)
- Say screw it, and just
svn mv
the files around after you've loaded the revision into the new repo
This is all fine until you realize that svndumpfilter
doesn't play nice with an
svn mv
outside of the directory you're filtering. That's when you have to play
with the exclude
subcommand, and pipe the output about 30 different times to
svndumpfilter
until you've got what you want. It's not enjoyable. I'll leave this one
as an exercise to the reader.