Hmm, it was kinda deliberate, from pre-receive docs in https://git-scm.com/docs/githooks: "If the hook exits with non-zero status, none of the refs will be updated. If the hook exits with zero, updating of individual refs can still be prevented by the update hook." I liked the per-ref nature, but it's probably a bit unimportant (eg. allowing to push WIP work while forbidding on master/stable branches). If you deem pre-receive a better place for that, I can change the script to take input as pre-receive hooks do.