överväga:

$ 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 

Detta är på macos med ett skiftlägeskänsligt filsystem . (Jag vet inte att det är relevant.) På värden där detta inträffar finns det en dockerbild som kör debian med samma katalog monterad, och i dockerbilden sker det motsatta beteendet:

$ 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 

För att vara tydlig är sekvensen av kommandon som körs här: git diff-index på dockarbilden (returnerar 0), git diff-index på värden (returnerar 1), git status på värden, git diff-index på värden (returnerar 0) , git diff-index på dockerbilden (returnerar 1).

I grund och botten, om jag kör git-status i en miljö, git diff-index kommer att lyckas (returnera 0) i den miljön och misslyckas i den andra. Några tankar om vad som händer? Det här är inte en stor sak, och jag har en misstanke om att ärendet okänslighet för filsystemet är att skylla på, men jag skulle gärna ha en gedigen förklaring.

Svar

Jag har haft en liknande problem med och jag tror att orsaken var densamma. Detta behöver inte involvera Docker eller skiftlägeskänsliga filsystem, även om dessa kan förvärra problemet.

Git upprätthåller en cache med information om filinnehållet. Normalt är detta transparent och på hög nivå kommandon som git status och git diff uppdaterar cachen efter behov.

Kommandon på lägre nivå som git diff-index och git diff-files är utformade för att ge snabba, men ungefärliga resultat. De uppdaterar inte cachen. De returnerar 0 om de är ”säkra på att de jämför de är identiska, men när de returnerar 1 betyder allt” jag är inte medveten om att sakerna är identiska ”. Om cacheposterna är inaktuella är det” det är möjligt att sakerna är identiska men git diff-xxx vet inte.

Jag vet inte exakt hur cachen fungerar. I ditt första experiment verkar det som om det första samtalet till git diff-index märkte att cacheposten var inaktuell och returnerade 1 för ”Jag vet inte”. Sedan git status uppdaterade cacheminnet och det andra samtalet till git diff-index såg giltiga cacheposter och kunde dra slutsatsen att filerna är identiska. I ditt andra experiment körs git status utanför Docker-behållaren verkar ha skapat cacheposter som git diff-index inuti behållaren anses vara inaktuell, så det andra anropet till git diff-index returnerade 1 för ”Jag vet inte”.

Min lösning var att glömma kommandon på låg nivå och hålla fast vid git diff --quiet.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *