vurder:
$ 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
Dette er på macos med et skiftesensitivt filsystem . (Jeg vet ikke at det er relevant.) På verten der dette skjer, er det et dockerbilde som kjører debian med den samme katalogen montert, og i dockerbildet oppstår motsatt oppførsel:
$ 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
For å være tydelig er sekvensen av kommandoer som utføres her: git diff-index
på dockerbildet (returnerer 0), git diff-index
på verten (returnerer 1), git status
på verten, git diff-index
på verten (returnerer 0) , git diff-index
på dockerbildet (returnerer 1).
I utgangspunktet, hvis jeg kjører git-status
i ett miljø, git diff-index
vil lykkes (returnere 0) i det miljøet og mislykkes i det andre. Noen tanker om hva som skjer? Dette er ikke en stor sak, og jeg har en mistanke om at saken ufølsomhet i filsystemet er skyld i, men jeg vil gjerne ha en solid forklaring.
Svar
Jeg har hatt en lignende problem med og jeg tror årsaken var den samme. Dette trenger ikke å involvere Docker eller store og små bokstaver, selv om disse kan forverre problemet.
Git opprettholder en cache med informasjon om innholdet i filer. Normalt er dette gjennomsiktig og høyt nivå kommandoer som git status
og git diff
oppdaterer hurtigbufferen etter behov.
Kommandoer på lavere nivå som git diff-index
og git diff-files
er designet for å gi raske, men omtrentlige resultater. De oppdaterer ikke hurtigbufferen. De returnerer 0 hvis de «er sikre på at tingene de sammenligner er identiske, men når de returnerer 1, betyr alt det» jeg er ikke klar over at tingene er identiske «. Hvis cacheoppføringene er foreldede, er det» Det er mulig at ting er identiske, men git diff-xxx
vet ikke.
Jeg vet ikke nøyaktig hvordan hurtigbufferen fungerer. I ditt første eksperiment ser det ut til at det første anropet til git diff-index
la merke til at cacheoppføringen var foreldet, og returnerte så 1 for «Jeg vet ikke». Så git status
oppdaterte hurtigbufferen, og den andre samtalen til git diff-index
så gyldige cacheoppføringer og kunne konkludere med at filene er identiske. I det andre eksperimentet ditt git status
utenfor Docker-beholderen ser ut til å ha opprettet hurtigbufferoppføringer som git diff-index
inne i containeren anses å være foreldet, så det andre kallet til git diff-index
returnerte 1 for “Jeg vet ikke”.
Min løsning var å glemme kommandoer på lavt nivå og holde oss til git diff --quiet
.