Since it took me a while to figure out, I figured this might be useful to document: migrating code from CVS to Git. Specifically, I was moving modules in a CVS repository on SourceForge over to GitHub.
Here are the versions of the tools that I used:
$ rsync --version | head -1
rsync version 3.1.0 protocol version 31
$ cvs --version | head -2 | tail -1
Concurrent Versions System (CVS) 1.12.13 (client/server)
$ git --version
git version 2.6.3
$ cvsps -V
cvsps: version 3.13
First, I grabbed a copy of the CVSROOT, and checked out the module so I had a reference copy to compare to when I’m done.
$ rsync -av aolserver.cvs.sourceforge.net::cvsroot/aolserver/ aolserver-cvs
$ cvs -d $(pwd)/aolserver-cvs co -d nsmysql-cvs nsmysql
Then, I create the working directory for the local git repo.
$ mkdir nsmysql
$ git init nsmysql
Next, do the actual CVS-to-Git conversion.
$ cvsps --root $(pwd)/aolserver-cvs nsmysql --fast-export | git --git-dir=nsmysql/.git fast-import
Finally, do a
diff to compare the two working directories to make sure the import worked correctly.
$ cd nsmysql
$ git checkout master
$ diff -x .git -x CVS -urN . ../nsmysql-cvs
If everything looks good, go ahead and push it up to GitHub.
$ git remote add origin firstname.lastname@example.org:aolserver/nsmysql.git
$ git config remote.origin.push HEAD
$ git push -u origin master
I don’t do this often, but when I do, I always have to figure it out each time, so hopefully next time I’ll find this blog post at the top of my search results and save myself some time.