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.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *