git for CVS users
=================

So you're a CVS user. That's OK, it's a treatable condition.  The job of
this document is to put you on the road to recovery, by helping you
convert an existing cvs repository to git, and by showing you how to use a
git repository in a cvs-like fashion.

Some basic familiarity with git is required.  This
link:tutorial.html[tutorial introduction to git] should be sufficient.

First, note some ways that git differs from CVS:

  * Commits are atomic and project-wide, not per-file as in CVS.

  * Offline work is supported: you can make multiple commits locally,
    then submit them when you're ready.

  * Branching is fast and easy.

  * 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; see below
    for details.

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
sure it is in your path.  The magic command line is then

-------------------------------------------
$ git cvsimport -v -d <cvsroot> -C <destination> <module>
-------------------------------------------

This puts a git archive of the named CVS module in the directory
<destination>, which will be created if necessary.  The -v option makes
the conversion script very chatty.

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.

Development Models
------------------

CVS users are accustomed to giving a group of developers commit access to
a common repository.  In the next section we'll explain how to do this
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.

Emulating the CVS Development Model
-----------------------------------

Start with an ordinary git working directory containing the project, and
remove the checked-out files, keeping just the bare .git directory:

------------------------------------------------
$ mv project/.git /pub/repo.git
$ rm -r project/
------------------------------------------------

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:

------------------------------------------------
$ chgrp -R $group repo.git
$ find repo.git -mindepth 1 -type d |xargs chmod ug+rwx,g+s
$ GIT_DIR=repo.git git repo-config core.sharedrepository true
------------------------------------------------

Make sure committers have a umask of at most 027, so that the directories
they create are writable and searchable by other group members.

Suppose this repository is now set up in /pub/repo.git on the host
foo.com.  Then as an individual committer you can clone the shared
repository:

------------------------------------------------
$ 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.

[NOTE]
================================
The first `git clone` places the following in the
`my-project/.git/remotes/origin` file, and that's why the previous step
and the next step both work.
------------
URL: foo.com:/pub/project.git/ my-project
Pull: master:origin
------------
================================

You can update the shared repository with your changes using:

------------------------------------------------
$ git push origin master
------------------------------------------------

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 repo.shared.xz:/pub/scm/project.git/
------------

as long as the shared repository does not have any branches
other than `master`.

[NOTE]
============
Because of this behavior, if the shared repository and the developer's
repository both have branches named `origin`, then a push like the above
attempts to update the `origin` branch in the shared repository from the
developer's `origin` branch.  The results may be unexpected, so it's
usually best to remove any branch named `origin` from the shared
repository.
============

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 link:hooks.html[Hooks used by git].

You can enforce finer grained permissions using update hooks.  See
link:howto/update-hook-example.txt[Controlling access to branches using
update hooks].

CVS annotate
------------

So, something has gone wrong, and you don't know whom to blame, and
you're an ex-CVS user and used to do "cvs annotate" to see who caused
the breakage. You're looking for the "git annotate", and it's just
claiming not to find such a script. You're annoyed.

Yes, that's right.  Core git doesn't do "annotate", although it's
technically possible, and there are at least two specialized scripts out
there that can be used to get equivalent information (see the git
mailing list archives for details). 

git has a couple of alternatives, though, that you may find sufficient
or even superior depending on your use.  One is called "git-whatchanged"
(for obvious reasons) and the other one is called "pickaxe" ("a tool for
the software archaeologist"). 

The "git-whatchanged" script is a truly trivial script that can give you
a good overview of what has changed in a file or a directory (or an
arbitrary list of files or directories).  The "pickaxe" support is an
additional layer that can be used to further specify exactly what you're
looking for, if you already know the specific area that changed.

Let's step back a bit and think about the reason why you would
want to do "cvs annotate a-file.c" to begin with.

You would use "cvs annotate" on a file when you have trouble
with a function (or even a single "if" statement in a function)
that happens to be defined in the file, which does not do what
you want it to do.  And you would want to find out why it was
written that way, because you are about to modify it to suit
your needs, and at the same time you do not want to break its
current callers.  For that, you are trying to find out why the
original author did things that way in the original context.

Many times, it may be enough to see the commit log messages of
commits that touch the file in question, possibly along with the
patches themselves, like this:

	$ git-whatchanged -p a-file.c

This will show log messages and patches for each commit that
touches a-file.

This, however, may not be very useful when this file has many
modifications that are not related to the piece of code you are
interested in.  You would see many log messages and patches that
do not have anything to do with the piece of code you are
interested in.  As an example, assuming that you have this piece
of code that you are interested in in the HEAD version:

	if (frotz) {
		nitfol();
	}

you would use git-rev-list and git-diff-tree like this:

	$ git-rev-list HEAD |
	  git-diff-tree --stdin -v -p -S'if (frotz) {
		nitfol();
	}'

We have already talked about the "\--stdin" form of git-diff-tree
command that reads the list of commits and compares each commit
with its parents (otherwise you should go back and read the tutorial).
The git-whatchanged command internally runs
the equivalent of the above command, and can be used like this:

	$ git-whatchanged -p -S'if (frotz) {
		nitfol();
	}'

When the -S option is used, git-diff-tree command outputs
differences between two commits only if one tree has the
specified string in a file and the corresponding file in the
other tree does not.  The above example looks for a commit that
has the "if" statement in it in a file, but its parent commit
does not have it in the same shape in the corresponding file (or
the other way around, where the parent has it and the commit
does not), and the differences between them are shown, along
with the commit message (thanks to the -v flag).  It does not
show anything for commits that do not touch this "if" statement.

Also, in the original context, the same statement might have
appeared at first in a different file and later the file was
renamed to "a-file.c".  CVS annotate would not help you to go
back across such a rename, but git would still help you in such
a situation.  For that, you can give the -C flag to
git-diff-tree, like this:

	$ git-whatchanged -p -C -S'if (frotz) {
		nitfol();
	}'

When the -C flag is used, file renames and copies are followed.
So if the "if" statement in question happens to be in "a-file.c"
in the current HEAD commit, even if the file was originally
called "o-file.c" and then renamed in an earlier commit, or if
the file was created by copying an existing "o-file.c" in an
earlier commit, you will not lose track.  If the "if" statement
did not change across such a rename or copy, then the commit that
does rename or copy would not show in the output, and if the
"if" statement was modified while the file was still called
"o-file.c", it would find the commit that changed the statement
when it was in "o-file.c".

NOTE: The current version of "git-diff-tree -C" is not eager
  enough to find copies, and it will miss the fact that a-file.c
  was created by copying o-file.c unless o-file.c was somehow
  changed in the same commit.

You can use the --pickaxe-all flag in addition to the -S flag.
This causes the differences from all the files contained in
those two commits, not just the differences between the files
that contain this changed "if" statement:

	$ git-whatchanged -p -C -S'if (frotz) {
		nitfol();
	}' --pickaxe-all

NOTE: This option is called "--pickaxe-all" because -S
  option is internally called "pickaxe", a tool for software
  archaeologists.
