I am looking for a shell script (sh
, not bash
possibly) that would refuse any push to master which has any non-linear history.
I t
This script worked for me! It protects selected branches against forced push and deletes.
#!/bin/sh
_REFNAME="$(echo "${1}" | sed -e 's,[^/]\+/,,g')"
_OLDREF="${2}"
_NEWREF="${3}"
_PROTECTED_LIST=( 'master' 'develop' )
_PROTECTED=false
for ref in "${_PROTECTED_LIST[@]}"; do
if [[ "${ref}" == "${_REFNAME}" ]]; then
_PROTECTED=true
fi;
done;
echo ""
echo "#################### YOUR PROJECT NAME ####################"
echo "Branch: ${_REFNAME}"
echo "Old ref: ${_OLDREF}"
echo "New ref: ${_NEWREF}"
echo ""
_SUCCESS=true
if ${_PROTECTED}; then
_GITOUT="$(git merge-base ${_OLDREF} ${_NEWREF} 2>/dev/null)"
if [[ -n "${_GITOUT}" && "${_GITOUT}" != "${_OLDREF}" ]]; then
echo "ERROR! You can't force the push on this branch!"
_SUCCESS=false
fi;
if [[ -n "$(echo "${_NEWREF}" | sed -n -e '/^0\+$/p')" ]]; then
echo "ERROR! You can't delete this branch!"
_SUCCESS=false
fi;
fi;
if ${_SUCCESS}; then
echo "SUCCESS! :-)"
echo "See you later?"
echo ""
exit 0
fi;
echo ""
exit 1