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:

committed by
Junio C Hamano

parent
1506fc34f7
commit
b8bc67cef3
@ -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
|
||||
---------------------------
|
||||
|
Reference in New Issue
Block a user