123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- 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
- -----------------------
- NOTE: These instructions use the `git-cvsimport` script which ships with
- git, but other importers may provide better results. See the note in
- linkgit:git-cvsimport[1] for other options.
- First, install version 2.1 or higher of cvsps from
- https://github.com/andreyvit/cvsps[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 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
|