gitcvs-migration man page
gitcvs-migration — Git for CVS users
git cvsimport *
Git differs from CVS in that every working tree contains a repository with a full copy of the project history, and no repository is inherently more important than any other. However, you can emulate the CVS model by designating a single shared repository which people can synchronize with; this document explains how to do that.
Some basic familiarity with Git is required. Having gone through gittutorial(7) and gitglossary(7) should be sufficient.
Importing a CVS Archive
These instructions use the git-cvsimport script which ships with git, but other importers may provide better results. See the note in git-cvsimport(1) for other options.
First, install version 2.1 or higher of cvsps from https://github.com/andreyvit/cvsps and make sure it is in your path. Then cd to a checked out CVS working directory of the project you are interested in and run git-cvsimport(1):
$ git cvsimport -C <destination> <module>
This puts a Git archive of the named CVS module in the directory <destination>, which will be created if necessary.
The import checks out from CVS every revision of every file. Reportedly cvsimport can average some twenty revisions per second, so for a medium-sized project this should not take more than a couple of minutes. Larger projects or remote repositories may take longer.
The main trunk is stored in the Git branch named origin, and additional CVS branches are stored in Git branches with the same names. The most recent version of the main trunk is also left checked out on the master branch, so you can start adding your own changes right away.
The import is incremental, so if you call it again next month it will fetch any CVS updates that have been made in the meantime. For this to work, you must not modify the imported branches; instead, create new branches for your own changes, and merge in the imported branches as necessary.
If you want a shared repository, you will need to make a bare clone of the imported directory, as described above. Then treat the imported directory as another development clone for purposes of merging incremental imports.
Providing CVS Access to a Git Repository
It is also possible to provide true CVS access to a Git repository, so that developers can still use CVS; see git-cvsserver(1) for details.
Alternative Development Models
CVS users are accustomed to giving a group of developers commit access to a common repository. As we’ve seen, this is also possible with Git. However, the distributed nature of Git allows other development models, and you may want to first consider whether one of them might be a better fit for your project.
For example, you can choose a single person to maintain the project’s primary public repository. Other developers then clone this repository and each work in their own clone. When they have a series of changes that they’re happy with, they ask the maintainer to pull from the branch containing the changes. The maintainer reviews their changes and pulls them into the primary repository, which other developers pull from as necessary to stay coordinated. The Linux kernel and other projects use variants of this model.
With a small group, developers may just pull changes from each other’s repositories without the need for a central maintainer.
gittutorial(7), gittutorial-2(7), gitcore-tutorial(7), gitglossary(7), giteveryday(7), The Git User’s Manual
Part of the git(1) suite
Controlling access to branches using update hooks
The Git User’s Manual
git(1), gitcore-tutorial(7), git-cvsimport(1), git-cvsserver(1), gitglossary(7), gittutorial(7), gittutorial-2(7).