| gitcvs-migration(7) | 
 | =================== | 
 |  | 
 | NAME | 
 | ---- | 
 | gitcvs-migration - Git for CVS users | 
 |  | 
 | SYNOPSIS | 
 | -------- | 
 | [verse] | 
 | 'git cvsimport' * | 
 |  | 
 | 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 | 
 | linkgit:gittutorial[7] and | 
 | linkgit:gitglossary[7] should be sufficient. | 
 |  | 
 | Developing against a shared repository | 
 | -------------------------------------- | 
 |  | 
 | Suppose a shared repository is set up in /pub/repo.git on the host | 
 | foo.com.  Then as an individual committer you can clone the shared | 
 | repository over ssh with: | 
 |  | 
 | ------------------------------------------------ | 
 | $ git clone foo.com:/pub/repo.git/ my-project | 
 | $ cd my-project | 
 | ------------------------------------------------ | 
 |  | 
 | and hack away.  The equivalent of 'cvs update' is | 
 |  | 
 | ------------------------------------------------ | 
 | $ git pull origin | 
 | ------------------------------------------------ | 
 |  | 
 | which merges in any work that others might have done since the clone | 
 | operation.  If there are uncommitted changes in your working tree, commit | 
 | them first before running git pull. | 
 |  | 
 | [NOTE] | 
 | ================================ | 
 | The 'pull' command knows where to get updates from because of certain | 
 | configuration variables that were set by the first 'git clone' | 
 | command; see `git config -l` and the linkgit:git-config[1] man | 
 | page for details. | 
 | ================================ | 
 |  | 
 | You can update the shared repository with your changes by first committing | 
 | your changes, and then using the 'git push' command: | 
 |  | 
 | ------------------------------------------------ | 
 | $ git push origin master | 
 | ------------------------------------------------ | 
 |  | 
 | to "push" those commits to the shared repository.  If someone else has | 
 | updated the repository more recently, 'git push', like 'cvs commit', will | 
 | complain, in which case you must pull any changes before attempting the | 
 | push again. | 
 |  | 
 | In the 'git push' command above we specify the name of the remote branch | 
 | to update (`master`).  If we leave that out, 'git push' tries to update | 
 | any branches in the remote repository that have the same name as a branch | 
 | in the local repository.  So the last 'push' can be done with either of: | 
 |  | 
 | ------------ | 
 | $ git push origin | 
 | $ git push foo.com:/pub/project.git/ | 
 | ------------ | 
 |  | 
 | as long as the shared repository does not have any branches | 
 | other than `master`. | 
 |  | 
 | Setting Up a Shared Repository | 
 | ------------------------------ | 
 |  | 
 | We assume you have already created a Git repository for your project, | 
 | possibly created from scratch or from a tarball (see | 
 | linkgit:gittutorial[7]), or imported from an already existing CVS | 
 | repository (see the next section). | 
 |  | 
 | Assume your existing repo is at /home/alice/myproject.  Create a new "bare" | 
 | repository (a repository without a working tree) and fetch your project into | 
 | it: | 
 |  | 
 | ------------------------------------------------ | 
 | $ mkdir /pub/my-repo.git | 
 | $ cd /pub/my-repo.git | 
 | $ git --bare init --shared | 
 | $ git --bare fetch /home/alice/myproject master:master | 
 | ------------------------------------------------ | 
 |  | 
 | Next, give every team member read/write access to this repository.  One | 
 | easy way to do this is to give all the team members ssh access to the | 
 | machine where the repository is hosted.  If you don't want to give them a | 
 | full shell on the machine, there is a restricted shell which only allows | 
 | users to do Git pushes and pulls; see linkgit:git-shell[1]. | 
 |  | 
 | Put all the committers in the same group, and make the repository | 
 | writable by that group: | 
 |  | 
 | ------------------------------------------------ | 
 | $ chgrp -R $group /pub/my-repo.git | 
 | ------------------------------------------------ | 
 |  | 
 | Make sure committers have a umask of at most 027, so that the directories | 
 | they create are writable and searchable by other group members. | 
 |  | 
 | Importing a CVS archive | 
 | ----------------------- | 
 |  | 
 | First, install version 2.1 or higher of cvsps from | 
 | http://www.cobite.com/cvsps/[http://www.cobite.com/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 linkgit: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. | 
 |  | 
 | Advanced Shared Repository Management | 
 | ------------------------------------- | 
 |  | 
 | Git allows you to specify scripts called "hooks" to be run at certain | 
 | points.  You can use these, for example, to send all commits to the shared | 
 | repository to a mailing list.  See linkgit:githooks[5]. | 
 |  | 
 | You can enforce finer grained permissions using update hooks.  See | 
 | link:howto/update-hook-example.html[Controlling access to branches using | 
 | update hooks]. | 
 |  | 
 | 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 linkgit: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. | 
 |  | 
 | SEE ALSO | 
 | -------- | 
 | linkgit:gittutorial[7], | 
 | linkgit:gittutorial-2[7], | 
 | linkgit:gitcore-tutorial[7], | 
 | linkgit:gitglossary[7], | 
 | linkgit:giteveryday[7], | 
 | link:user-manual.html[The Git User's Manual] | 
 |  | 
 | GIT | 
 | --- | 
 | Part of the linkgit:git[1] suite. |