On 7/14/2011 12:29 PM, K F wrote:
Recap – I would like to move some directories from one repository to
another while keeping the history.


I went through this a few months ago (and maybe this will help). We were using a big monolithic repository for all of our jobs. Our repository was arranged as:

("jobs" repository)
/A/ABClient/ABJob1/...
/A/AXClient/AXJob1/...
/A/AXClient/AXJob2/...
/B/BQClient/BQJob1/...
/C/CAClient/CAJob1/...
/C/CMClient/CMJob1/...
/C/CMClient/CMJob2/...

We wanted to split each client out to a different repository. The output repositories would look like:

("jobs-ab")
/ABJob1/...

("jobs-ax")
/AXJob1/...
/AXJob2/...

("jobs-bq")
/BQJob1/...

("jobs-ca")
/CAJob1/...

("jobs-cm")
/CMJob1/...
/CMJob2/...

Which made all the URLs a lot shorter because the "/A/ABClient" was often something lengthy like "/A/AB_Acme_Border_Wings_Inc".

1) A shell script to split out a specific directory. We had to edit the CLCODE and CLPATH lines for each run (took 30-40 minutes to parse the monolithic jobs repository and split out a particular client's tree).

Each time I did a new client, I had to make sure that everyone was ready for that client's project tree to move. Alternately, I could have made the entire "jobs" tree read-only for a week...

(Apologies if there are errors in this as I had to quickly edit out some client/company specific paths. I always executed the script as "bash -x scriptname" so I could spot errors. The "date" lines are just there so I could keep track of how long it took.)

#!/bin/bash

DESTDIR=/var/svn/
DESTPFX=svn-raw-jobs-
DESTSFX=10xx.dump.gz

CLCODE=bq
CLPATH=B/BQClient

SDFOPTS='--drop-empty-revs  --renumber-revs'

date

echo ${DESTDIR}${DESTPFX}${CLCODE}${DESTSFX}

svnadmin dump --quiet /var/svn/jobs | \
    svndumpfilter include --quiet $SDFOPTS $CLPATH | gzip > \
    ${DESTDIR}${DESTPFX}${CLCODE}${DESTSFX}

date

2) Created the new repository (such as "jobs-bq" for the BQClient). Although you could probably roll that into the import script.

# svnadmin create jobs-bq

3) Edited the following import script for each new run. Loading it up was a fairly quick process. Note that we update the UUID of the new repository to make sure that nobody commits outdated stuff.

I gave up on trying to re-base on the fly using "sed" and simply moved all of the individual job folders into the root of the new repository and then cleaned up the left-over folder.

Our script also had to create the "letter" level in the new repository. Otherwise the import had no place to hang itself off of.

You may want to drop the chmod/chgrp lines towards the end. For our server, we only use svn+ssh authentication. Each users has their own local account on the server and they belong to a "svn-jobs" group which gives them read/write access to the entire repository.

#!/bin/bash

SRCDIR=/var/svn/
SRCPFX=svn-raw-jobs-
SRCSFX=10xx.dump.gz

DESTDIR=/var/svn/
DESTPFX=svn-newbase-jobs-
DESTSFX=10xx.dump.gz

CLPARENT=B
CLCODE=bq

date

svn mkdir -m "Import from jobs" \
    file:///var/svn/jobs-${CLCODE}/${CLPARENT}

gunzip -c ${SRCDIR}${SRCPFX}${CLCODE}${SRCSFX} | \
    svnadmin load --quiet /var/svn/jobs-${CLCODE}

svnlook uuid /var/svn/jobs-${CLCODE}
svnadmin setuuid /var/svn/jobs-${CLCODE}
svnlook uuid /var/svn/jobs-${CLCODE}
svnadmin pack /var/svn/jobs-${CLCODE}

chmod -R 775 /var/svn/jobs-${CLCODE}
chmod -R g+s /var/svn/jobs-${CLCODE}/db
chgrp -R svn-jobs /var/svn/jobs-${CLCODE}

date

4) After the load into the new repository, I would access the repository through TortoiseSVN's Repository Browser and drag all of the individual jobs folders from being under "/A/ABClient/" up to the root of the new repository. Then I deleted the "/A/ABClient/" tree.

If I could have figured out how to remap on the fly via "sed", I could have avoided step #4. But it was good enough for our purposes and a few historical entries in the SVN log showing the movement of the folders wasn't a big deal.

5) After we finished the splits, we chmod'd the old repository to be read-only and took it completely offline a month or two later.

Reply via email to