$ git clone repo.shared.xz:/pub/scm/project.git/ my-project -$ cd my-project -$ hack away-
From: Junio C Hamano
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".
-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 git for CVS users for the details.