rsync
Git 작업 디렉터리를 대상으로 실행하는 스크립트가 있습니다. 작업 디렉토리가 깨끗한지(커밋할 변경 사항이 없음)에 따라 스크립트가 다르게 작동하기를 원합니다. 예를 들어, 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
올바른 방향으로 가고 있지만 불행하게도 커밋되지 않은 변경 사항이 있을 때 반환 코드는 변경되지 않습니다. 그러나 그것은 제공합니다--porcelain
git 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
답변4
이런 테스트를 했는데요
TEST=$(git status --porcelain|wc -l)
if [ 0 -eq $TEST ]; then
echo "No changes"
else
echo "Changes"
fi