sourcecode

현재 지점에서 커밋할 사항이 없는지 어떻게 확인합니까?

copyscript 2023. 7. 8. 11:07
반응형

현재 지점에서 커밋할 사항이 없는지 어떻게 확인합니까?

목표는 셸 명령에서 평가할 수 있는 명확한 상태를 얻는 것입니다.

나는 노력했다.git status그러나 커밋할 항목이 있더라도 항상 0을 반환합니다.

git status
echo $?  #this is always 0

나는 생각이 있지만 그것은 오히려 나쁜 생각이라고 생각합니다.

if [ git status | grep -i -c "[a-z]"> 2 ];
then
 code for change...
else
  code for nothing change...
fi

다른 방법은 없습니까?


다음 해결책으로 업데이트, Mark Longair의 게시물 참조

저는 이것을 시도했지만 문제가 발생합니다.

if [ -z $(git status --porcelain) ];
then
    echo "IT IS CLEAN"
else
    echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
    echo git status
fi

다음 오류가 발생합니다.[: ??: binary operator expected

지금, 나는 그 남자를 보고 있고 Git diff를 시도합니다.

=================== 내 희망을 위한 코드, 그리고 더 나은 대답을 바랍니다======================

#if [ `git status | grep -i -c "$"` -lt 3 ];
# change to below code,although the above code is simple, but I think it is not strict logical
if [ `git diff --cached --exit-code HEAD^ > /dev/null && (git ls-files --other --exclude-standard --directory | grep -c -v '/$')` ];
then
        echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
    exit 1

else
    exit 0
fi

다음의 출력을 테스트할 수 있는 대안git status --porcelainis empty는 관심 있는 각 조건을 개별적으로 테스트하는 것입니다.예를 들어 출력에 추적되지 않은 파일이 있는지 여부에 대해 항상 신경쓰지 않을 수 있습니다.git status.

예를 들어, 준비되지 않은 로컬 변경 사항이 있는지 확인하려면 다음의 반환 코드를 확인할 수 있습니다.

git diff --exit-code

준비되었지만 커밋되지 않은 변경 사항이 있는지 확인하려면 다음과 같은 반환 코드를 사용할 수 있습니다.

git diff --cached --exit-code

마지막으로 작업 트리에 무시되지 않는 추적되지 않은 파일이 있는지 확인하려면 다음 명령의 출력이 비어 있는지 테스트할 수 있습니다.

git ls-files --other --exclude-standard --directory

업데이트: 아래에 해당 명령을 변경하여 출력에서 디렉터리를 제외할 수 있는지 묻습니다.다음을 추가하여 빈 디렉토리를 제외할 수 있습니다.--no-empty-directory그러나 해당 출력에서 모든 디렉터리를 제외하려면 다음과 같이 출력을 필터링해야 합니다.

git ls-files --other --exclude-standard --directory | egrep -v '/$'

-v로.egrep패턴과 일치하지 않는 라인만 출력하고 패턴은 다음으로 끝나는 라인과 일치합니다./.

의 반환 값git status의 종료 코드를 알려줍니다.git status커밋해야 할 수정 사항이 있는 경우에는 그렇지 않습니다.

보다 컴퓨터에서 읽을 수 있는 버전의git status출력, 시도

git status --porcelain

자세한 내용은 의 설명을 참조하십시오.

샘플 사용(스크립트는 단순히 다음과 같은 경우 테스트)git status --porcelain모든 출력을 제공하며, 구문 분석이 필요하지 않습니다):

if [ -n "$(git status --porcelain)" ]; then
  echo "there are changes";
else
  echo "no changes";
fi

테스트할 문자열을 인용해야 합니다. 즉, 출력git status --porcelain테스트 구성에 대한 자세한 내용은 Advanced Bash 스크립팅 가이드(섹션 문자열 비교)를 참조하십시오.

만약 당신이 나와 같다면, 당신은 다음과 같은 것들이 있는지 알고 싶을 것입니다.

기존 파일 변경 2) 새로 추가된 파일 3) 삭제된 파일

특히 4) 추적되지 않은 파일에 대해 알고 싶지 않습니다.

이렇게 하면 됩니다.

git status --untracked-files=no --porcelain

레포가 깨끗할 경우 스크립트를 종료하기 위한 bash 코드입니다.추적되지 않은 파일 옵션의 짧은 버전을 사용합니다.

[[ -z $(git status -uno --porcelain) ]] && echo "this branch is clean, no need to push..." && kill -SIGINT $$;

저는 이것에 대해 테스트를 할 것입니다.

git diff --quiet --cached

또는 이를 명시적으로 설명합니다.

git diff --quiet --exit-code --cached

위치:

--hyp-code

diff(1)와 유사한 코드로 프로그램을 종료합니다.즉, 차이가 있으면 1로 종료되고 0은 차이가 없음을 의미합니다.

--조용한

프로그램의 모든 출력을 비활성화합니다.--exit-code를 의미합니다.

합이가니다합능을 조합하는 것이 git status --porcelain 단히로grep테스트를 수행합니다.

if git status --porcelain | grep .; then
    echo Repo is dirty
else
    echo Repo is clean
fi

저는 가끔 이것을 간단한 원라이너로 사용합니다.

# pull from origin if our repo is clean
git status --porcelain | grep . || git pull origin master

더하다-qs당신의 grep 명령에 따라 그것을 침묵하게 합니다.

git 소스 코드에서 다음을 포함하는 sh 스크립트가 있습니다.

require_clean_work_tree () {
    git rev-parse --verify HEAD >/dev/null || exit 1
    git update-index -q --ignore-submodules --refresh
    err=0

    if ! git diff-files --quiet --ignore-submodules
    then
        echo >&2 "Cannot $1: You have unstaged changes."
        err=1
    fi

    if ! git diff-index --cached --quiet --ignore-submodules HEAD --
    then
        if [ $err = 0 ]
        then
            echo >&2 "Cannot $1: Your index contains uncommitted changes."
        else
            echo >&2 "Additionally, your index contains uncommitted changes."
        fi
        err=1
    fi

    if [ $err = 1 ]
    then
        test -n "$2" && echo >&2 "$2"
        exit 1
    fi
}

이 스니플릿은 사용이 가능한 방법을 보여줍니다.git diff-files그리고.git diff-index이전에 알려진 파일에 변경 사항이 있는지 확인합니다.그러나 알 수 없는 새 파일이 작업 트리에 추가되었는지 확인할 수는 없습니다.

이 스크립트를 사용하여 다음 작업을 수행합니다.

  • 모든 것이 깨끗할 때 0
  • 1 어렵거나 추적되지 않은 파일이 있는 경우

    [ -z "$(git status --dll)" ]

토론에 조금 늦었지만, 만약 당신이 종료 코드가 0이면 됩니다.git status --porcelain아무 것도 반환하지 않고!= 0을(를) 반환합니다.

exit $( git status --porcelain | wc -l )

이렇게 하면 255개가 넘는 줄이 있을 때 문제가 발생할 위험이 있으므로 줄 수가 종료 코드가 됩니다.그렇게

exit $( git status --porcelain | head -255 | wc -l )

그것을 설명할 것입니다 ;)

Git-submodule이 포함된 경우 모든 답변이 유용하지 않습니다.

소규모 조사를 통해 간편하고 신뢰할 수 있는 최상의 솔루션을 찾았습니다.

git commit --dry-run && echo "Things to commit" || echo "Clean repo"

추가할 수 있습니다.-a인덱스뿐만 아니라 변경 사항도 고려해야 하는 경우(하위 모듈도 업데이트해야 함).

예쁘지는 않지만 효과가 있습니다.

git status | grep -qF 'working directory clean' || echo "DIRTY"

메시지가 로케일에 따라 달라졌는지 확실하지 않으므로, 다음을 입력할 수 있습니다.LANG=C맨 앞에

.git log ranges은 -에 - 당길 야 한다고 말합니다.) - 기후또오당 - 함및눌함야다나러을니 - 겨가야타/냅는져또나▁)다함니타.

스크립팅이 필요한 경우:

[ "$(git log ..origin/main)" == "" ] || (
  echo "something new on main"
  .. pull ?
)
[ "$(git rev-list origin/main..)" == "" ] || (
  echo "something new local"
  .. push ?
)

기사의 자세한 내용

언급URL : https://stackoverflow.com/questions/5139290/how-to-check-if-theres-nothing-to-be-committed-in-the-current-branch

반응형