스크립트를 통해 Git 작업 디렉터리가 깨끗한지 확인

스크립트를 통해 Git 작업 디렉터리가 깨끗한지 확인

rsyncGit 작업 디렉터리를 대상으로 실행하는 스크립트가 있습니다. 작업 디렉토리가 깨끗한지(커밋할 변경 사항이 없음)에 따라 스크립트가 다르게 작동하기를 원합니다. 예를 들어, git status출력이 다음과 같은 경우 스크립트가 종료되기를 원합니다.

git status
Already up-to-date.
# On branch master
nothing to commit (working directory clean)
Everything up-to-date

디렉토리가 깨끗하지 않으면 더 많은 명령을 실행하고 싶습니다.

쉘 스크립트에서 위와 같은 출력을 어떻게 확인할 수 있나요?

답변1

구문 분석된 출력 git status은 기계가 읽을 수 있는 것이 아니라 사람이 읽을 수 있기 때문에 좋지 않은 생각입니다. Git의 향후 버전이나 다르게 구성된 환경에서 출력이 동일하게 유지된다는 보장은 없습니다.

UVV 검토git status올바른 방향으로 가고 있지만 불행하게도 커밋되지 않은 변경 사항이 있을 때 반환 코드는 변경되지 않습니다. 그러나 그것은 제공합니다--porcelaingit status --porcelain스크립트에서 쉽게 구문 분석할 수 있는 형식으로 출력 형식을 지정하는 옵션그리고사용자 구성에 관계없이 Git 버전 전체에서 안정적입니다.

git status --porcelain커밋할 변경 사항이 없다는 표시로 빈 출력을 사용할 수 있습니다 .

if [ -z "$(git status --porcelain)" ]; then 
  # Working directory clean
else 
  # Uncommitted changes
fi

작업 디렉토리에서 추적되지 않은 파일에 관심이 없다면 다음을 사용할 수 있습니다.--untracked-files=no다음을 무시하도록 선택할 수 있습니다.

if [ -z "$(git status --untracked-files=no --porcelain)" ]; then 
  # Working directory clean excluding untracked files
else 
  # Uncommitted changes in tracked files
fi

다음 조건에서 더욱 견고하게 만들려면실제로git status로 출력하지 않으면 오류가 발생하므로 stdout다음과 같이 검사를 세분화할 수 있습니다.

if output=$(git status --porcelain) && [ -z "$output" ]; then
  # Working directory clean
else 
  # Uncommitted changes
fi

git status작업 디렉터리가 깨끗하지 않으면 의미 있는 종료 코드가 제공되지 않지만, 종료 코드가 git diff제공된다는 점도 주목할 가치가 있습니다.--exit-code옵션은 다음과 같이 동작하게 합니다.차이점1차이점이 존재하고 0차이점이 발견 되지 않은 경우 상태로 종료되는 유틸리티입니다 .

이를 사용하여 다음을 통해 단계적이지 않은 변경 사항을 확인할 수 있습니다.

git diff --exit-code

변경사항이 적용되었지만 커밋되지 않았습니다.

git diff --cached --exit-code

git diff하위 모듈의 추적되지 않은 파일은 적절한 매개변수를 통해 보고될 수 있지만--ignore-submodules, 불행하게도 실제 작업 디렉터리에서 추적되지 않은 파일을 보고하도록 하는 방법은 없는 것 같습니다. 작업 디렉토리에 있는 추적되지 않은 파일이 관련된 경우 git status --porcelain이것이 최선의 선택일 수 있습니다 .

답변2

사용:

git update-index --really-refresh
git diff-index --quiet HEAD

반환 코드는 작업 디렉터리의 상태를 반영합니다(0 = 깨끗함, 1 = 더러움). 추적되지 않은 파일은 무시됩니다.

답변3

약간 확장됨안드레의훌륭한답변.

추적되지 않은 파일은 무시됩니다.

git update-index --really-refresh
if git diff-index --quiet HEAD
then
  GIT_MODS="clean"
else
  GIT_MODS="dirty"
fi

stdout에 내용을 넣는 것을 피하려면 >> /dev/null다음과 같은 것을 추가해야 할 수도 있습니다 update-index.

답변4

이런 테스트를 했는데요

TEST=$(git status --porcelain|wc -l)
if [ 0 -eq $TEST ]; then
   echo "No changes"
else
   echo "Changes"
fi 

관련 정보