cvs-migration documentation update

Here's some changes to the cvs-migration.txt.  As usual, in my attempt
to make things clearer someone may have found I've made them less so, or
I may have just gotten something wrong; so any review is welcomed.

I can break up this sort of thing into smaller steps if preferred, the
monolothic patch is just a bit simpler for me for this sort of
thing.

I moved the material describing shared repository management from
core-tutorial.txt to cvs-migration.txt, where it seems more appropriate,
and combined two sections to eliminate some redundancy.

I also revised the earlier sections of cvs-migration.txt, mainly trying
to make it more concise.

I've left the last section of cvs-migration.txt (on CVS annotate
alternatives) alone for now.

Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
J. Bruce Fields
2006-01-28 23:31:47 -05:00
committed by Junio C Hamano
parent 1506fc34f7
commit b8bc67cef3
2 changed files with 147 additions and 207 deletions

View File

@ -1623,123 +1623,7 @@ suggested in the previous section may be new to you. You do not
have to worry. git supports "shared public repository" style of
cooperation you are probably more familiar with as well.
For this, set up a public repository on a machine that is
reachable via SSH by people with "commit privileges". Put the
committers in the same user group and make the repository
writable by that group. Make sure their umasks are set up to
allow group members to write into directories other members
have created.
You, as an individual committer, then:
- First clone the shared repository to a local repository:
------------------------------------------------
$ git clone repo.shared.xz:/pub/scm/project.git/ my-project
$ cd my-project
$ hack away
------------------------------------------------
- Merge the work others might have done while you were hacking
away:
------------------------------------------------
$ git pull origin
$ test the merge result
------------------------------------------------
[NOTE]
================================
The first `git clone` would have placed the following in
`my-project/.git/remotes/origin` file, and that's why this and
the next step work.
------------
URL: repo.shared.xz:/pub/scm/project.git/ my-project
Pull: master:origin
------------
================================
- push your work as the new head of the shared
repository.
------------------------------------------------
$ git push origin master
------------------------------------------------
If somebody else pushed into the same shared repository while
you were working locally, `git push` in the last step would
complain, telling you that the remote `master` head does not
fast forward. You need to pull and merge those other changes
back before you push your work when it happens.
The `git push` command without any explicit refspec parameter
pushes the refs that exist both in the local repository and the
remote repository. So the last `push` can be done with either
one of these:
------------
$ 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]
============
If you created your shared repository by cloning from somewhere
else, you may have the `origin` branch. Your developers
typically do not use that branch; remove it. Otherwise, that
would be pushed back by the `git push origin` because your
developers' repository would surely have `origin` branch to keep
track of the shared repository, and would be counted as "exist
on both ends".
============
Advanced Shared Repository Management
-------------------------------------
Being able to push into a shared repository means being able to
write into it. If your developers are coming over the network,
this means you, as the repository administrator, need to give
each of them an SSH access to the shared repository machine.
In some cases, though, you may not want to give a normal shell
account to them, but want to restrict them to be able to only
do `git push` into the repository and nothing else.
You can achieve this by setting the login shell of your
developers on the shared repository host to `git-shell` program.
[NOTE]
Most likely you would also need to list `git-shell` program in
`/etc/shells` file.
This restricts the set of commands that can be run from incoming
SSH connection for these users to only `receive-pack` and
`upload-pack`, so the only thing they can do are `git fetch` and
`git push`.
You still need to create UNIX user accounts for each developer,
and put them in the same group. Make sure that the repository
shared among these developers is writable by that group.
. Initializing the shared repository with `git-init-db --shared`
helps somewhat.
. Run the following in the shared repository:
+
------------
$ chgrp -R $group repo.git
$ find repo.git -type d -print | xargs chmod ug+rwx,g+s
$ GIT_DIR=repo.git git repo-config core.sharedrepository true
------------
The above measures make sure that directories lazily created in
`$GIT_DIR` are writable by group members. You, as the
repository administrator, are still responsible to make sure
your developers belong to that shared repository group and set
their umask to a value no stricter than 027 (i.e. at least allow
reading and searching by group members).
You can implement finer grained branch policies using update
hooks. There is a document ("control access to branches") in
Documentation/howto by Carl Baldwin and JC outlining how to (1)
limit access to branch per user, (2) forbid overwriting existing
tags.
See link:cvs-migration.txt[git for CVS users] for the details.
Bundling your work together
---------------------------