overvej:
$ 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 ved ikke, at det er relevant.) På værten, hvor dette sker, er der et dockerbillede, der kører debian med den samme mappe monteret, og i dockerbilledet forekommer den modsatte adfærd:
$ 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 at være klar er rækkefølgen af kommandoer, der udføres her: git diff-index
på dockerbilledet (returnerer 0), git diff-index
på værten (returnerer 1), git status
på værten, git diff-index
på værten (returnerer 0) , git diff-index
på dockerbilledet (returnerer 1).
Grundlæggende, hvis jeg kører git-status
i et miljø, git diff-index
vil lykkes (returnere 0) i det miljø og mislykkes i det andet. Eventuelle tanker om hvad der foregår? Dette er ikke en big deal, og jeg har en mistanke om, at sagen Ufølsomhed i filsystemet er skylden, men jeg ville elske en solid forklaring.
Svar
Jeg har haft en lignende problem med og jeg tror, at årsagen var den samme. Dette behøver ikke at involvere Docker eller sagsfølsomme filsystemer, selvom disse kan forværre problemet.
Git opretholder en cache med information om indholdet af filer. Normalt er dette gennemsigtigt og på højt niveau kommandoer som git status
og git diff
opdaterer cachen efter behov.
Kommandoer på lavere niveau som git diff-index
og git diff-files
er designet til at returnere hurtige, men omtrentlige resultater. De opdaterer ikke cachen. De returnerer 0, hvis de “er sikre på, at de ting, de sammenligner, er identiske, men når de returnerer 1, betyder alt, at” jeg er ikke klar over, at tingene er identiske “. Hvis cacheindgangene er uaktuelle, er det” det er muligt, at tingene er identiske, men git diff-xxx
ved ikke.
Jeg ved ikke nøjagtigt, hvordan cachen fungerer. I dit første eksperiment ser det ud til, at det første opkald til git diff-index
bemærkede, at cacheindgangen var forældet, og så returnerede 1 for “Jeg ved ikke”. Derefter git status
opdaterede cachen, og det andet opkald til git diff-index
så gyldige cacheindgange og kunne konkludere, at filerne er identiske. I dit andet eksperiment kørte du git status
uden for Docker-containeren ser ud til at have oprettet cacheindgange, som git diff-index
inde i containeren anses for at være uaktuelle, så det andet kald til git diff-index
returnerede 1 for “Jeg ved det ikke”.
Min løsning var at glemme kommandoer på lavt niveau og holde mig til git diff --quiet
.