Git을“스크립트”로 확실하게 만드는 열쇠는 '배관'명령을 사용하는 것입니다.
개발자는 배관 명령을 변경할 때 매우 안정적인 인터페이스를 제공하도록주의를 기울입니다 (예 : 지정된 저장소 상태, stdin, 명령 행 옵션, 인수 등의 조합이 명령 / 명령이있는 모든 버전의 Git에서 동일한 출력을 생성 함) 옵션이 존재합니다). 배관 명령의 새로운 출력 변형은 새로운 옵션을 통해 도입 될 수 있지만 이전 버전에 대해 이미 작성된 프로그램에는 아무런 문제가 발생할 수 없습니다 (새로운 옵션은 존재하지 않았기 때문에 (또는 적어도 사용되지 않음) 스크립트가 작성된 시점).
불행히도 '매일'Git 명령은 'porcelain'명령이므로 대부분의 Git 사용자는 배관 명령에 익숙하지 않을 수 있습니다. 자기 명령과 배관 명령의 구분은 기본 git 맨 페이지 에서 이루어집니다 (하위 레벨 명령 (도자기) 및 하위 레벨 명령 (배관) 이라는 하위 섹션 참조 ) .
커밋되지 않은 변경 사항을 찾으려면 git diff-index
다른 트리 (예 :)와 비교하여 인덱스 (및 작업 트리의 추적 비트 비교 HEAD
), git diff-files
(인덱스와 작업 트리 비교) 및 git ls-files
(파일 목록; 추적되지 않은 목록 나열) , 무시되지 않은 파일).
(아래 명령에서 이라는 파일 이 있으면 명령 이 실패 하기 때문에 HEAD --
대신 사용됩니다 .)HEAD
HEAD
리포지토리가 단계적 변경 (아직 커밋되지 않은)을 확인하려면 다음을 사용하십시오.
git diff-index --quiet --cached HEAD --
- 종료되면
0
차이가 없었습니다 (차이가 1
있음을 의미).
작업 트리에 스테이징 가능한 변경 사항이 있는지 확인하려면 다음을 수행하십시오.
git diff-files --quiet
- 종료 코드는
git diff-index
( 0
== 차이점 없음; 1
== 차이점)과 동일합니다.
작업 트리에서 색인과 추적 된 파일의 조합이 다음과 관련하여 변경되었는지 확인하려면 다음을 수행하십시오 HEAD
.
git diff-index --quiet HEAD --
- 이것은 이전 두 가지의 조합과 같습니다. 주요한 차이점 중 하나는 작업 트리에서 "실행 취소"한 단계적 변경 사항이있는 경우 여전히 "차이 없음"을보고한다는 것입니다 (에있는 내용으로 돌아 가기
HEAD
). 이와 같은 상황에서 두 개의 개별 명령은 모두 "차이가 존재"한다는 보고서를 반환합니다.
추적되지 않은 파일도 언급했습니다. "추적되지 않은 및 무시 됨"을 의미하거나 일반 "추적되지 않은"(무시 된 파일 포함)을 의미 할 수 있습니다. 어느 쪽이든 git ls-files
, 작업을위한 도구입니다.
"추적되지 않은"의 경우 (있는 경우 무시 된 파일 포함) :
git ls-files --others
"추적되지 않은 및 무시 된"의 경우 :
git ls-files --exclude-standard --others
내 첫 번째 생각은 이러한 명령에 출력이 있는지 확인하는 것입니다.
test -z "$(git ls-files --others)"
- 종료되면
0
추적되지 않은 파일이 없습니다. 종료되면 1
추적되지 않은 파일이 있습니다.
이로 인해 비정상 종료가 git ls-files
"추적되지 않은 파일 없음"보고서로 변환 될 가능성이 적습니다 (두 가지 모두 위 명령이 종료되지 않음). 좀 더 강력한 버전은 다음과 같습니다.
u="$(git ls-files --others)" && test -z "$u"
- 아이디어는 이전 명령과 동일하지만 예기치 않은 오류
git ls-files
가 전파 될 수 있습니다. 이 경우, 0이 아닌 종료는 "추적되지 않은 파일이 있음"을 의미하거나 오류가 발생했음을 의미 할 수 있습니다. 대신 "오류"결과와 "추적되지 않은 파일 없음"결과를 함께 사용하려면 test -n "$u"
종료를 0
"추적되지 않은 일부 파일", 0이 아닌 경우 오류 또는 "추적되지 않은 파일 없음"을 사용하십시오.
또 다른 아이디어는 --error-unmatch
추적되지 않은 파일이 없을 때 0이 아닌 종료를 발생시키는 데 사용 하는 것입니다. 또한 1
"오류가 발생했습니다"(0이 아닌 경우도 있지만)로 " 추적되지 않은 파일 없음"(종료 ) 을 병합 할 위험이 있습니다 128
. 그러나 0이 아닌 종료 코드 0
대 1
vs. 종료 코드를 확인하는 것은 상당히 강력합니다.
git ls-files --others --error-unmatch . >/dev/null 2>&1; ec=$?
if test "$ec" = 0; then
echo some untracked files
elif test "$ec" = 1; then
echo no untracked files
else
echo error from ls-files
fi
추적되지 않은 파일과 무시되지 않은 파일 만 고려하려는 경우 위의 git ls-files
예를 사용할 수 있습니다 --exclude-standard
.