현재 지점에서 커밋할 사항이 없는지 어떻게 확인합니까?
목표는 셸 명령에서 평가할 수 있는 명확한 상태를 얻는 것입니다.
나는 노력했다.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 --porcelain
is 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
'sourcecode' 카테고리의 다른 글
ASP.NET에서 기본 페이지를 설정하는 방법은 무엇입니까? (0) | 2023.07.08 |
---|---|
SQL Server - 저장 프로시저가 완료될 때까지 테이블을 잠그는 방법 (0) | 2023.07.08 |
SQL Server 2005의 교착 상태 진단 (0) | 2023.07.08 |
프로필을 spring.profiles.include로 포함하면 include 대신 재정의되는 것 같습니다. (0) | 2023.07.08 |
UITableFacebook 응용 프로그램처럼 아래로 스크롤할 때 더 많이 로드됩니다. (0) | 2023.07.08 |