2005-10-11 01:01:31 +02:00
|
|
|
git for CVS users
|
2005-06-08 00:52:06 +02:00
|
|
|
=================
|
|
|
|
|
2006-12-07 05:18:05 +01:00
|
|
|
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.
|
2005-06-08 00:52:06 +02:00
|
|
|
|
2006-01-29 05:31:47 +01:00
|
|
|
Some basic familiarity with git is required. This
|
|
|
|
link:tutorial.html[tutorial introduction to git] should be sufficient.
|
2005-06-08 00:52:06 +02:00
|
|
|
|
2006-12-07 05:18:05 +01:00
|
|
|
Developing against a shared repository
|
|
|
|
--------------------------------------
|
2005-06-08 00:52:06 +02:00
|
|
|
|
2006-12-07 05:18:05 +01:00
|
|
|
Suppose a shared repository is set up in /pub/repo.git on the host
|
2006-06-07 14:56:45 +02:00
|
|
|
foo.com. Then as an individual committer you can clone the shared
|
2006-12-07 05:18:05 +01:00
|
|
|
repository over ssh with:
|
2006-01-29 05:31:47 +01:00
|
|
|
|
|
|
|
------------------------------------------------
|
|
|
|
$ 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
|
2006-12-07 05:18:05 +01:00
|
|
|
operation. If there are uncommitted changes in your working tree, commit
|
|
|
|
them first before running git pull.
|
2006-01-29 05:31:47 +01:00
|
|
|
|
|
|
|
[NOTE]
|
|
|
|
================================
|
2007-01-01 00:47:33 +01:00
|
|
|
The `pull` command knows where to get updates from because of certain
|
|
|
|
configuration variables that were set by the first `git clone`
|
2007-01-29 01:16:53 +01:00
|
|
|
command; see `git config -l` and the gitlink:git-config[1] man
|
2007-01-01 00:47:33 +01:00
|
|
|
page for details.
|
2006-01-29 05:31:47 +01:00
|
|
|
================================
|
|
|
|
|
2006-12-09 04:58:50 +01:00
|
|
|
You can update the shared repository with your changes by first committing
|
|
|
|
your changes, and then using the gitlink:git-push[1] command:
|
2005-06-08 00:52:06 +02:00
|
|
|
|
2006-01-29 05:31:47 +01:00
|
|
|
------------------------------------------------
|
|
|
|
$ git push origin master
|
|
|
|
------------------------------------------------
|
2005-06-08 00:52:06 +02:00
|
|
|
|
2006-12-06 18:19:50 +01:00
|
|
|
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.
|
2005-08-01 16:32:58 +02:00
|
|
|
|
2006-01-29 05:31:47 +01:00
|
|
|
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:
|
2005-08-01 16:32:58 +02:00
|
|
|
|
2006-01-29 05:31:47 +01:00
|
|
|
------------
|
|
|
|
$ git push origin
|
2006-12-07 05:18:05 +01:00
|
|
|
$ git push foo.com:/pub/project.git/
|
2006-01-29 05:31:47 +01:00
|
|
|
------------
|
2005-08-01 16:32:58 +02:00
|
|
|
|
2006-01-29 05:31:47 +01:00
|
|
|
as long as the shared repository does not have any branches
|
|
|
|
other than `master`.
|
|
|
|
|
2006-12-07 05:18:05 +01:00
|
|
|
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 the
|
|
|
|
link:tutorial.html[tutorial]), or imported from an already existing CVS
|
|
|
|
repository (see the next section).
|
|
|
|
|
2006-12-09 04:58:50 +01:00
|
|
|
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:
|
2006-12-07 05:18:05 +01:00
|
|
|
|
|
|
|
------------------------------------------------
|
2006-12-09 04:58:50 +01:00
|
|
|
$ mkdir /pub/my-repo.git
|
|
|
|
$ cd /pub/my-repo.git
|
2007-01-12 22:01:46 +01:00
|
|
|
$ git --bare init --shared
|
2006-12-09 04:58:50 +01:00
|
|
|
$ git --bare fetch /home/alice/myproject master:master
|
2006-12-07 05:18:05 +01:00
|
|
|
------------------------------------------------
|
|
|
|
|
|
|
|
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 gitlink:git-shell[1].
|
|
|
|
|
|
|
|
Put all the committers in the same group, and make the repository
|
|
|
|
writable by that group:
|
|
|
|
|
|
|
|
------------------------------------------------
|
2006-12-09 04:58:50 +01:00
|
|
|
$ chgrp -R $group /pub/my-repo.git
|
2006-12-07 05:18:05 +01:00
|
|
|
------------------------------------------------
|
|
|
|
|
|
|
|
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
|
|
|
|
link:http://www.cobite.com/cvsps/[http://www.cobite.com/cvsps/] and make
|
2006-12-09 04:58:50 +01:00
|
|
|
sure it is in your path. Then cd to a checked out CVS working directory
|
|
|
|
of the project you are interested in and run gitlink:git-cvsimport[1]:
|
2006-12-07 05:18:05 +01:00
|
|
|
|
|
|
|
-------------------------------------------
|
2006-12-09 04:58:50 +01:00
|
|
|
$ git cvsimport -C <destination>
|
2006-12-07 05:18:05 +01:00
|
|
|
-------------------------------------------
|
|
|
|
|
|
|
|
This puts a git archive of the named CVS module in the directory
|
2006-12-09 04:58:50 +01:00
|
|
|
<destination>, which will be created if necessary.
|
2006-12-07 05:18:05 +01:00
|
|
|
|
|
|
|
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.
|
2006-01-29 05:31:47 +01:00
|
|
|
|
|
|
|
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
|
2006-09-14 03:04:33 +02:00
|
|
|
repository to a mailing list. See link:hooks.html[Hooks used by git].
|
2006-01-29 05:31:47 +01:00
|
|
|
|
|
|
|
You can enforce finer grained permissions using update hooks. See
|
|
|
|
link:howto/update-hook-example.txt[Controlling access to branches using
|
|
|
|
update hooks].
|
2005-06-08 00:52:06 +02:00
|
|
|
|
2006-12-07 05:18:05 +01:00
|
|
|
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 gitlink: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.
|
2005-06-06 02:46:06 +02:00
|
|
|
|
2006-12-07 05:18:05 +01:00
|
|
|
With a small group, developers may just pull changes from each other's
|
|
|
|
repositories without the need for a central maintainer.
|