Create a gist now

Instantly share code, notes, and snippets.

Git pre-push hook to prevent force pushing the master branch.
# This script will install a Git pre-push hook that prevents force pushing the master branch.
# Install in current Git repo:
# curl -fL | sh
# Uninstall:
# rm .git/hooks/pre-push
# in each repository that you've added this to.
GITROOT=`git rev-parse --show-toplevel 2> /dev/null`
if [ "$GITROOT" == "" ]; then
echo This does not appear to be a git repo.
exit 1
if [ -f "$GITROOT/.git/hooks/pre-push" ]; then
echo There is already a pre-push hook installed. Delete it first.
echo " rm '$GITROOT/.git/hooks/pre-push'"
exit 2
echo Downloading pre-push hook from
curl -fL -o "$GITROOT/.git/hooks/pre-push" ""
if [ ! -f "$GITROOT/.git/hooks/pre-push" ]; then
echo Error downloading pre-push script!
exit 3
chmod +x "$GITROOT/.git/hooks/pre-push"
echo "You're all set! Happy hacking!"
exit 0
# Prevents force-pushing to master.
# Based on:
# Install:
# cd path/to/git/repo
# curl -fL -o .git/hooks/pre-push
# chmod +x .git/hooks/pre-push
BRANCH=`git rev-parse --abbrev-ref HEAD`
PUSH_COMMAND=`ps -ocommand= -p $PPID`
if [[ "$BRANCH" == "master" && "$PUSH_COMMAND" =~ force|delete|-f ]]; then
echo "Prevented force-push to $BRANCH. This is a very dangerous command."
echo "If you really want to do this, use --no-verify to bypass this pre-push hook."
exit 1
exit 0
dlin-me commented Nov 20, 2014


bean5 commented Dec 17, 2014

Nice. You reference this page in the file itself. Handy.

centerge commented Jan 6, 2015

thanks for this!

brange commented Jun 26, 2015

I changed the $PUSH_COMMAND comparison to =~ force|delete|-f|"+master" to prevent git push origin +master


is there a way to have this hook available on a new clone of the repository ? so basically it is somehow installed on the server and then gets installed on the client side with a clone. the idea being to stop accidental checkin to master for e.g.


@rajah1313 Not from the server to a client, but you can change your default git hooks that are created when you clone a repository, and include this hook there. See this thread for details:

If you have control over the server, you can install a git hook there to prevent force pushes etc. GitHub also has protected branches these days, which didn't exist when I created this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment