pre-receive hook on server-side that refuse any push to master which has any non-linear history

前端 未结 3 1650
一向
一向 2020-12-06 08:31

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

3条回答
  •  既然无缘
    2020-12-06 08:47

    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
    
    

提交回复
热议问题