Comparto este útil hook de Git para bloquear commits y merges en una rama específica. Este script se lanza antes de presentarse el mensaje del commit, por lo que se puede evitar realizar commits en la rama indicada y también se pueden evitar realizar merges.
El único inconveniente es que al bloquear un merge o un commits, el directorio de trabajo se queda justo en el estado previo a lanzar el comando ‘git commit’ por lo que si se trata de un merge y nuestro directorio de trabajo siempre debe mantenerse limpio se debe realizar esta limpieza manualmente utilizando:
git reset HEAD && git checkout .
Eso hará que se deshagan todas las modificaciones existentes no comiteadas.
El archivo es prepare-commit-msg, código:
#!/bin/bash
red='\x1b[41m'
nocolor='\x1b[0m'
protected_branch='produccion'
current_branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
if [ $protected_branch = $current_branch ]
then
echo -e "${red}Estas en $current_branch, RAMA BLOQUEADA${nocolor}"
read -p "¿quieres realmente hacerlo? [y/n]" -n 1 -r < /dev/tty
echo
if echo $REPLY | grep -E '^[Yy]$' > /dev/null
then
exit 0 # se ejecuta
fi
exit 1 # NO se ejecuta
else
exit 0 # se ejecuta
fi
Recordad que para que funcione se debe habilitar el permiso de ejecución:
chmod +x .git/hooks/prepare-commit-msg
Más información en git-scm.com