Is there a way to configure git repository to reject 'git push –force'?

I was wondering is there a way to prevent ‘git push --force‘ on a repository (only on master branch)?

Assume I have remote git repository and do:

  • Storing Android eclipse projects in version control?
  • Using JGit, "IncorrectObjectTypeException: Object … is not a tree
  • How to remove subversion remote in git?
  • Is a more targeted recovery from git bisect mistakes possible?
  • How to delete stashes as a batch?
  • squash multiple historical commits
    • git push‘ to ‘master’. It works.
    • git push --force‘ to ‘branch-1’. It works.
    • git push --force‘ to ‘master’. It is rejected.

    Is it even possible?

    Thanks for any answers and suggestions.

    BR,
    Dawid.

  • Maven JGitFlow plugin authentication for HTTPS
  • Issue with pulling in Visual studio 2015
  • Git auto-merge fails (gives conflicts) for almost all files changed in only one branch
  • How to delete a branch and all the objects it referenced
  • gitk and hook script
  • Doing a three-way compare with Git and KDiff3
  • 2 Solutions collect form web for “Is there a way to configure git repository to reject 'git push –force'?”

    Setting the configuration variables:

    receive.denyNonFastForwards
    receive.denyDeletes
    

    will prevent any ‘forced’ pushes from working across all branches.

    If you want finer pre-branch control then you will have to use a ‘hook’ on the remote repository, probably the ‘update’ hook.

    There is a sample update hook called ‘update-paranoid’ that probably does what you need (and more) in the git distribution in the ‘contrib’ folder.

    gitweb link

    I wrote this quick update hook to prevent non-fast-forward updates (pushes) on the “dev” branch in a repository:

    #!/bin/sh
    
    REFNAME=$1
    OLDSHA=$2
    NEWSHA=$3
    
    if [ "refs/heads/dev" != $REFNAME ]; then
      exit 0
    fi
    
    MERGEBASE=$(git merge-base $OLDSHA $NEWSHA)
    if [ $OLDSHA = $MERGEBASE ]; then
      exit 0
    fi
    
    echo "Not a fast-forward on branch dev"
    exit 1
    
    Git Baby is a git and github fan, let's start git clone.