Gitでmasterへのpushを禁止するpre-hook

git config --global init.templatedir '~/.git_template'
mkdir -p ~/.git_template/hooks
cd ~/.git_template/hooks
vim pre-push
#!/usr/bin/env bash
remote="$1"
url="$2"

IFS=' '

allow=$(git config prevent-push-master.allow)
for pattern in $allow
do
    if [[ $url =~ $pattern ]]; then
        exit 0
    fi
done

read local_ref local_sha remote_ref remote_sha
if [[ $remote_ref =~ 'master' ]]; then
    echo 'Prevented push for master branch!'
    exit 1
fi
chmod +x pre-push

これで git initgit clone した時に、.git/hooks にシンボリックリンクを貼ってくれるようになります。ただし、既存のリポジトリへは、個別に git init を行っておく必要があります。

なお、例外的にmasterへのpushを許可したいリポジトリがある場合は、以下のようにホワイトリストに追加します。

git config --global prevent-push-master.allow 'repo1 repo2'