Subject: Efficient way to import snapshots?

From: Craig Boston <[email-masked]>
Date: Mon, 30 Jul 2007 13:07:11 -0500

Hello, I'm seeking some input from git users/developers to try and solve
a problem I'm encountering.  I'm new with git, having used quite a bit
of Subversion and SVK in the past, but have heard good things and
decided to give it a try.

First, a little bit about what I'm trying to accomplish.  There is a
large source tree -- FreeBSD to be specific -- which is maintained in
CVS.  I want to have several local branches where I can develop specific
projects.  Each of these branches should derive from either the HEAD of
the CVS tree, or from one of the release branches (known as the -STABLE
branch for a particular version of the OS).

That said, I really don't want to have to import the entire CVS
repository.  It has many, many branches and tags that I'm not interested
in, and I really don't need the entire history of the project.  I don't
even really need individual commit history.  I can see that easily enough
on cvsweb.  Repo size is a big factor as I need to replicate it between
several different work machines, some of which don't have unlimited disk
space.

What I'm currently doing (using SVK) is nightly, taking a snapshot using
cvsup of each of the 3 branches that I care about, then using "svk
import" to pull the snapshot into a local branch that I treat as a
vendor branch.  My projects are branched off those and I regularly
smerge changes over.  It works pretty well for me, the only downside is
that svk isn't exactly fast, having to load lots of perl modules for
every command.

I'd like to do something similar with git -- I like the idea of it
having many less dependencies that must be installed, and it's supposed
to be quite a bit faster when dealing with working copies.  From reading
about it I think it may also be easier to generate diffs of my branches
from their origins.

So far the main snag I've found is that AFAIK there's no equivalent to
"svk import" to load a big tree (~37000 files) into a branch and commit
the changes.  Here's the procedure I've come up with:

cd /path/to/git/repo
git checkout vendor_branch_X
git rm -r .
cp -R /path/to/cvs/checkout_X/* ./
git add .
git commit -m"Import yyyymmdd snapshot"

However this has quite a few disadvantages when compared to svk.  The
first is that I have to checkout into a working directory and then copy
the files from the cvs checkout.  It is also considerably slower than
svk import, about 7-8 times on average.  When there are a lot of
changes I've seen the git process use upwards of 1GB of memory; it
actually died the first time I tried it because I didn't have any swap
configured.

Now, I don't have very much experience with git, so for my question: Is
there a better way to do this?  Either importing a lot of files into
git, or a better solution for that I'm trying to do.

Any pointers would be much appreciated.

Thanks!

Craig