local CHECKOUTED_IN_LOWERDIR=false; # 性能优化 if [ -e "/tmp/CHECKOUT_IN_COW" ]; then if [[ "$PLUGIN_TARGET_REF" =~ ^refs/heads/.* ]]; then local BRANCH_NAME=$(echo "$PLUGIN_TARGET_REF" | cut -c12-) if [ $(git rev-parse HEAD 2>/dev/null) = "$PLUGIN_TARGET_SHA" ] && [ $(git branch --show-current) = "$BRANCH_NAME" ]; then _log "git branch --show-current" git branch --show-current _log "git rev-parse HEAD"; git rev-parse HEAD; CHECKOUTED_IN_LOWERDIR=true; fi else if [ $(git rev-parse HEAD 2>/dev/null) = "$PLUGIN_TARGET_SHA" ]; then _log "git rev-parse HEAD"; git rev-parse HEAD; CHECKOUTED_IN_LOWERDIR=true; fi fi fi if [ -e "/tmp/FETCHED_IN_CLONE" ]; then _log "skip fetch due to fetched in clone" elif [ "$CHECKOUTED_IN_LOWERDIR" = true ]; then _log "skip fetch due to fetched in cow" else # 刚 git init 从来没有 git fetch 的情况,显示进度,防止超时 _log "git for-each-ref refs/tags/ refs/heads/ refs/remotes/ |wc -l" REF_COUNT=$(git for-each-ref refs/tags/ refs/heads/ refs/remotes/ |wc -l) echo $REF_COUNT ret=$? if [[ $REF_COUNT -eq 0 ]]; then _log "It maybe a empty repo. show progress" MAYBE_EMPTY_REPO=1 fi # clear tags,remotes,heads _log 'git for-each-ref --format="delete \"%(refname)\"" refs/tags/ refs/heads/ refs/remotes/ |git update-ref --stdin' git for-each-ref --format="delete \"%(refname)\"" refs/tags/ refs/heads/ refs/remotes/ |git update-ref --stdin local OPTIONS="-v --progress --force --no-recurse-submodules" local REFMAP="" if [[ "$PLUGIN_TARGET_REF" =~ ^refs/heads/.* ]]; then REFMAP="--refmap=+refs/heads/*:refs/remotes/origin/*" elif [[ "$PLUGIN_TARGET_REF" =~ ^refs/tags/.* ]]; then REFMAP="--refmap=+refs/tags/*:refs/tags/*" else REFMAP="" fi _log "git fetch $OPTIONS $REFMAP origin \"${PLUGIN_TARGET_REF}\"" git fetch $OPTIONS $REFMAP origin "${PLUGIN_TARGET_REF}" fetch_ret=$? # 如果fetch失败了 if [[ $fetch_ret -ne 0 ]] && [[ $MAYBE_EMPTY_REPO -eq 1 ]]; then # 再换个准确的办法判断是不是空仓 _log "git count-objects -v" count_object_result=$(git count-objects -v) count=$(echo "$count_object_result" | grep count: | cut -c8-) packs=$(echo "$count_object_result" | grep packs: | cut -c8-) if [[ $count == "0" ]] && [[ $packs == "0" ]]; then _log "It's empty repo" touch "/tmp/IS_EMPTY_REPO" exit 0; else _log "exit due to fetch failed." exit $fetch_ret; fi fi fi if [ -e "/tmp/CHECKOUTED_IN_CLONE" ]; then _log "skip checkout due to checkouted in clone"; if ! [ "$PLUGIN_NEED_MERGE" = true ]; then _log "skip checkout submodules due to checkouted in clone"; exit 0 fi elif [ "$CHECKOUTED_IN_LOWERDIR" = true ]; then _log "skip checkout due to checkouted in cow" else # do checkout if [[ "$PLUGIN_TARGET_REF" =~ ^refs/heads/.* ]]; then _log "git update-ref refs/fetched/${PLUGIN_TARGET_SHA} FETCH_HEAD" git update-ref refs/fetched/${PLUGIN_TARGET_SHA} FETCH_HEAD local BRANCH_NAME=$(echo "$PLUGIN_TARGET_REF" | cut -c12-) _log "git checkout --progress -f -B \"$BRANCH_NAME\" \"${PLUGIN_TARGET_SHA:-FETCH_HEAD}\"" git checkout --progress -f -B "$BRANCH_NAME" "${PLUGIN_TARGET_SHA:-FETCH_HEAD}" ret=$?; [ $ret -ne 0 ] && exit $ret; _log "git clean -ffdx" git clean -ffdx _log "git branch -u \"origin/$BRANCH_NAME\"" git branch -u "origin/$BRANCH_NAME" _log "git branch --show-current" git branch --show-current elif [[ "$PLUGIN_TARGET_REF" =~ ^refs/tags/.* ]]; then _log "git update-ref refs/fetched/${PLUGIN_TARGET_SHA} FETCH_HEAD" git update-ref refs/fetched/${PLUGIN_TARGET_SHA} FETCH_HEAD _log "git checkout --progress -f \"${PLUGIN_TARGET_SHA:-FETCH_HEAD}\"" git checkout --progress -f "${PLUGIN_TARGET_SHA:-FETCH_HEAD}" ret=$?; [ $ret -ne 0 ] && exit $ret; _log "git clean -ffdx" git clean -ffdx else _log "git update-ref refs/fetched/${PLUGIN_TARGET_SHA} FETCH_HEAD" git update-ref refs/fetched/${PLUGIN_TARGET_SHA} FETCH_HEAD _log "git checkout --progress -f \"${PLUGIN_TARGET_SHA:-FETCH_HEAD}\"" git checkout --progress -f "${PLUGIN_TARGET_SHA:-FETCH_HEAD}" ret=$?; [ $ret -ne 0 ] && exit $ret; _log "git clean -ffdx" git clean -ffdx fi fi git cat-file -e "${PLUGIN_TARGET_SHA:-FETCH_HEAD}^{commit}" if ! [ "$?" == 0 ]; then _log -e "Error: ${PLUGIN_TARGET_SHA} not found!" exit 1 fi