gitcvs-migration - Git for CVS users
Contents
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.
Description
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.
Git
Part of the git(1) suite
Importing A Cvs Archive
Note
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.
Name
gitcvs-migration - Git for CVS users
Notes
1. Controlling access to branches using update hooks
file:///usr/share/doc/git/html/howto/update-hook-example.html
2. The Git User’s Manual
file:///usr/share/doc/git/html/user-manual.html
Git 2.50.0 07/03/2025 GITCVS-MIGRATION(7)
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.
See Also
gittutorial(7), gittutorial-2(7), gitcore-tutorial(7), gitglossary(7), giteveryday(7), TheGitUser’sManual[2]
Synopsis
gitcvsimport *
