git checkout이 업데이트를 가져와야 하는지 확인하는 문자열 출력 해킹보다 더 좋은 방법이 있습니까?

git checkout이 업데이트를 가져와야 하는지 확인하는 문자열 출력 해킹보다 더 좋은 방법이 있습니까?

기본적으로 로컬 브랜치를 확인하고 git pull && git submodule update && make clean필요한 경우에만 원격 업데이트를 가져오려는 자동화된 빌드 스크립트가 있습니다. 그렇지 않으면 빌드할 때 많은 시간을 낭비하게 됩니다.

로컬 변경이 이루어지고 원격 업데이트가 있거나 원격 업데이트만 있는 경우 두 경우 모두 git checkout의 출력에 "your Branch"라는 하위 문자열이 포함된다는 것을 알았습니다(빨리 감기 등이 가능함). 이것을 내 조건으로 삼았습니다.

나는 이것에 대해 불안감을 느낀다.

리모컨에 가져올 업데이트가 있고 병합 충돌 없이 가져올 수 있는지 확인하는 안정적인 방법이 있습니까?

편집: 현재 내가 가지고 있는 더 큰 스크립트는 다음과 같습니다.

OUTPUT=$( { git checkout "$NAME" ; } 2>&1 ) || { echo "Failed checking out branch" >&2; exit 1; }
[[ "$OUTPUT" == *"Your branch "* ]] && { git pull && git submodule update && make clean || { echo "Failed pulling, updating or cleaning branch" >&2; exit 1; }; }

답변1

어떤 단계에서는 원격 저장소에서 정보를 가져와야 합니다. 현재 다운로드 정보를 사용 git pull하고 병합하고 있습니다. 이를 두 단계로 나누어 먼저 원격 저장소의 상태 정보를 다운로드해야 합니다. 두 번째 단계는 최신 상태인지 확인하고, 그렇지 않은 경우 데이터를 병합하고 make clean과 make를 수행하는 것입니다.

말했듯 git pull --helpgit fetch또는 .git rebasegit merge

로컬 분기의 이름과 추적 중인 분기를 알고 있는 경우 하위 수준 명령을 사용하여 git show-ref해시를 가져와 동일한지 확인할 수 있습니다. 이는 업스트림 분기를 정확하게 추적하는 경우에만 작동하지만 매우 저렴합니다.

same_commit(){
    set -- $(git show-ref --hash --verify "$@")
    [ "$1" = "$2" ]
}
# get the changes if any, but don't merge them yet
git fetch origin
# See if there are any changes
if same_commit mainline origin/mainline
then
   echo "Everything up to date"
   exit 0
fi
# Now merge the remote changes
git pull origin
make clean
make

로컬 변경 사항도 있는 경우 로컬 브랜치에 모든 업스트림 콘텐츠가 있는지 확인해야 합니다.

contains(){
    # return true if the first name has the second as an ancestor
    git merge-base --is-ancestor "$2" "$1"
}
if contains master origin/master
then
    echo nothing to do
    return 0
fi

관련 정보