Voici un petit hook github qui s’exécute à chaque fois que vous ferez un git push et qui :
– vous empêchera de faire des push force sur certaines branches ;
– vous empêchera de faire des push sur certaines branches ;
– vous demandera confirmation pour d’autres branches ;
– laissera le comportement par défaut pour les branches non spécifiées.

Ce hook permet par exemple de ne pas pusher sur la branch master (faites des pull requests !) ou bien de vous demander confirmation quand vous pushez sur des branches un peu sensibles.

Installation

Copiez le code ci-après dans .git/hooks/pre-push de votre projet. Rendez le exécutable avec

chmod +x .git/hooks/pre-push

Vous pouvez ensuite modifier les variables :
NOPUSHFORCE_BRANCHES_PATTERN, liste des branches pour lesquelles le push force ne sera plus possible
NOPUSH_BRANCHES_PATTERN, liste des branches pour lesquelles le push ne sera plus possible
CONFIRM_BRANCH_PATTERN, les branches pour lesquelles on vous demandera confirmation.

Le code du Hook

#!/bin/bash
## CONFIG
# Pattern of branch name you won't be allowed to push force
NOPUSHFORCE_BRANCHES_PATTERN="^(dev|release-*|patch-*)"
# Pattern of branch name you won't be allowed to push
NOPUSH_BRANCHES_PATTERN="^(master)"
# Pattern of branch name that will ask to confirm before pushing
CONFIRM_BRANCH_PATTERN="^(master|production)"
## VARS
FORCE_PUSH_PATTERN="force|delete|-f"
CURRENT_BRANCH=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
PUSH_COMMAND=`ps -ocommand= -p $PPID`
## Deny push force
if [[ "$CURRENT_BRANCH" =~ $NOPUSHFORCE_BRANCHES_PATTERN && "$PUSH_COMMAND" =~ $FORCE_PUSH_PATTERN ]]; then
echo "Pre-push hook: push force on branch \"$CURRENT_BRANCH\" is not allowed"
exit 1
fi
## Deny push
if [[ "$CURRENT_BRANCH" =~ $NOPUSH_BRANCHES_PATTERN ]]; then
echo "Pre-push hook: push on branch \"$CURRENT_BRANCH\" is not allowed"
exit 1
fi
## Ask confirmation
if [[ "$CURRENT_BRANCH" =~ $CONFIRM_BRANCH_PATTERN ]]
then
read -p "You're about to push on \"$CURRENT_BRANCH\". Are you really sure? [Y|n] " -n 1 -r < /dev/tty echo if echo $REPLY | grep -E '^[YyOo]$' > /dev/null ; then
exit 0
else
exit 1
fi
fi
exit 0

Le code est aussi disponible sur Gist.