고려 :
$ git --version git version 2.20.1 (Apple Git-117) $ git diff-index --quiet HEAD ; echo $? 1 $ git status > /dev/null $ git diff-index --quiet HEAD ; echo $? 0
이것은 대소 문자를 구분하지 않는 파일 시스템을 사용하는 macOS에 있습니다. . (관련성이 있는지는 모르겠습니다.)이 문제가 발생하는 호스트에는 동일한 디렉토리가 마운트 된 데비안을 실행하는 도커 이미지가 있으며 도커 이미지에서는 반대 동작이 발생합니다.
$ git diff-index --quiet HEAD ; echo $? 0 # At this point, `git status` was invoked outside the docker image $ git --version git version 2.20.1 $ git diff-index --quiet HEAD ; echo $? 1
여기에서 실행되는 명령의 순서는 다음과 같습니다. docker 이미지의 git diff-index
(0 반환), (1 반환), 호스트의 git status
, 호스트의 git diff-index
(0 반환) , git diff-index
on the docker image (returns 1).
기본적으로 한 환경에서 git-status
를 실행하면 git diff-index
는 해당 환경에서 성공 (0 반환)하고 다른 환경에서는 실패합니다. 무슨 일이 벌어지고 있는지에 대한 생각이 있으신가요? 이것은 큰 문제가 아닙니다. 파일 시스템의 무감각 함이 원인이지만 확실한 설명이 필요합니다.
답변
나는 그리고 그 원인은 동일하다고 생각합니다. 문제를 악화시킬 수 있지만 Docker 또는 대소 문자를 구분하지 않는 파일 시스템을 포함 할 필요는 없습니다.
Git은 파일 내용에 대한 정보 캐시를 유지합니다. 일반적으로 이것은 투명하고 높은 수준입니다. git status
및 git diff
와 같은 명령은 필요에 따라 캐시를 업데이트합니다.
git diff-index
및 git diff-files
는 신속하지만 대략적인 결과를 반환하도록 설계되었으며 캐시를 업데이트하지 않습니다. “비교하는 항목이 동일하다고 확신하는 경우 0을 반환하지만 1을 반환하면”내가 항목이 동일하다는 것을 알지 못합니다. “라는 의미입니다. 캐시 항목이 오래된 경우” 모든 것이 동일하지만 git diff-xxx
는 “모릅니다.
캐시가 어떻게 작동하는지 정확히 모릅니다. 첫 번째 실험에서 git diff-index
에 대한 첫 번째 호출에서 캐시 항목이 부실한 것을 발견하여 “모름”에 대해 1을 반환 한 것 같습니다. 그런 다음 git status
가 캐시를 업데이트했으며 git diff-index
에 대한 두 번째 호출은 유효한 캐시 항목을 확인하고 파일이 동일하다는 결론을 내릴 수있었습니다. 두 번째 실험에서는 다음을 실행했습니다. Docker 컨테이너 외부의 git status
는 컨테이너 내부에서 부실한 것으로 간주되는 git diff-index
캐시 항목을 생성 한 것으로 보이므로 두 번째 호출은 git diff-index
는 “모름”에 대해 1을 반환했습니다.
저의 해결책은 저수준 명령을 잊어 버리고 git diff --quiet
.