How to set up a shared repository
From: Johannes Schindelin <hidden>
Date: 2016-06-15 22:42:15
Hi, I installed a shared git repository in the last few days and this is the result. May it be useful! Ciao, Dscho --- [Note: this text assumes you have applied the core.umask patch] So, there you are. You know CVS (or at least its concepts), and you want to set up a shared repository. A. Setting up the umask 1. Separate repository box If you are lucky enough that you can afford a separate machine for the shared repository: Good. Just make sure that the umask is set group friendly, either by ensuring that (assuming the login shell is bash) $HOME/.bash_profile contains the line umask 0002 or by using git-shell, which you have modified by inserting umask(0002); at the start of main(). 2. Some server accessible by ssh If there are valid reasons not to set umask (maybe you want to allow other uses of that machine), or if you just do not want to go through the hassle to find out which scripts your login shell executes at startup, you just have to git-repo-config core.umask 0002 B. Making sure the index is not corrupted by a push 1. No checkout! You can use the shared repository just like you use CVS: no working directory. To disallow a checkout, just do touch .git/index chmod a-rwx .git/index Every attempt to modify the index (which is invalid), will now result in an error. 2. Ensure index and working directory consistency (no locking) If you want to be able to work on the project in the shared repository, create hooks, as follows: test -d .git/hooks || mkdir .git/hooks cat > .git/hooks/update << EOF #!/bin/sh # if the working directory contains modifications, do not allow push HEAD=$(git-symbolic-ref HEAD) case "$1" in $HEAD) unset GIT_DIR cd .. && test -z "$(git-diff-index --name-only HEAD)";; esac EOF chmod a+x .git/hooks/update cat > .git/hooks/post-update << EOF #!/bin/sh # checkout HEAD, and build HEAD=$(git-symbolic-ref HEAD) case "$1" in $HEAD) unset GIT_DIR umask 0002 cd .. && git checkout -f HEAD && make;; esac EOF chmod a+x .git/hooks/post-update This assumes that your project contains a Makefile, and that the tools necessary to build are installed on the repository server. Note that I did not check if a push locks another push.