ö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
.