Hi,
I have script which wraps git-cvsimport and git-cvsexport, called "git-cvs".
The main aim of the script is to automate the steps for tracking a CVS repository with the git-cvs* commands.
It's not currently as sophisticated as git-svn, it's undoubtably flawed and isn't foolproof (e.g. exports to CVS of merged git histories can be problematic), but I find it useful, because a lot of the nitty-gritty is done for me.
I'd like to ask:
- Is this at all useful to anyone else in it's current form?
- Is there any prior art I should be aware of? (Presumably most people just roll their own scripts, like I have)
- Bearing in mind that it's a work-in progress, are there any suggestions for improvement?
The script can be found in its current state here:
http://github.com/wu-lee/git-cvs/
There's no installer, but the script is self-contained and just needs to be on the execution $PATH (as well as git and cvs).
Given a CVS repository at $CVS_ROOT, tracking a module $CVS_MODULE can be done like this:
# Create a git repo git init
# Initialise git-cvs's config file echo cvsroot=$CVS_ROOT >.git-cvs echo cvsmodule=$CVS_MODULE >>.git-cvs
# First pull gets cvs files using git-cvsimport # (optionally you can supply the option # --author-file <authormap> for pass-through # to git-cvsimport -A on subsequent invocations) git-cvs pull
# hack hack...
# Push the files back into CVS with git-cvsexportcommit # (This pushes the commits master..remotes/cvs/cvshead by default, # or cvsworking/NAME..remotes/cvs/NAME for each CVS branch NAME) git-cvs push
# Pull the changes back into remote/cvs/cvshead and # (a messy part I've not found a way round yet) throw away our # locally merged commits git-cvs pull git reset --hard master
# More hacking...
# Repeat push/pull steps as needed
Some other points:
- Changes in CVS get pulled back, including multiple branches.
- An author-mapping file can be supplied as for cvs-import -A
- The script creates local CVS working directories .git/git-cvs/cvscheckout/NAME, one for each CVS branch NAME.
- Git's master branch tracks CVS's HEAD branch.
- A git branch cvsworking/NAME is created to track each CVS branch NAME.
- Edits in these branches get pushed back to the appropriate CVS branches.
- Verbose subcommand output currently goes into .git/git-cvs/logs.
- Invoking git-cvs with no parameters gets information about the options.
- In an emergency, a list of commit ids can be supplied to git-cvs push.
- Written in Perl, uses only core modules (tested with v5.8.8)
- There is a small test suite in t/, run individually or with "prove/*.t"
Thanks,
Nick