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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *