Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

This is my first time setting up a git server, so I don't really know what I am doing yet. Anyways, I have a git server setup with a user, What I want is to have multiple developers that can create their own branches and push the branches to origin, but I don't want them to push anything to master; an admin will merge after a code review. Is that possible?

share|improve this question
up vote 3 down vote accepted

Gitolite can do this for you. There's no way for you to set this up with the default git setup.

share|improve this answer

If you don't want to use Gitolite, add this to your update hook:

[ "$1" != refs/heads/master ] || {
    echo "ERROR:  you are not allowed to update master" >&2
    exit 1
share|improve this answer
Won't this only allow pushing to master, not the other way around? – daramarak May 29 '15 at 12:51
@daramarak: No, notice the ||. It's expressed as an assertion: "the ref is not master, or else error out." I did it that way instead of [ "$1" = refs/heads/master ] && { ... } because assertion style is idiomatic for shell scripting (it makes error handling easier). – Richard Hansen May 29 '15 at 18:08
Ah, I see. Not to used to read bash scripting. A bit confusing. Was comparing this to an another answer. Anyway this should have been the correct answer. Thanks. – daramarak May 30 '15 at 5:11

Extending the answer of Richard a bit: Use the following snippet as your "hooks/update" and pushing to master will only be allowed to the user with the name "git-repo-admin":

if [ $USER != "git-repo-admin" ];
  if [ "$1" == refs/heads/master ];
    echo "Manual pushing to this repo is restricted"
    exit 1
share|improve this answer
This won't work where my origin is set to, as $USER will always be "git". – RCross Oct 15 '14 at 15:57
USER_EMAIL=$(git log -1 --format=format:%ae HEAD) USER_NAME=$(git log -1 --format=format:%an HEAD)… – Krekkon Nov 25 '14 at 11:45

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.