Beachten Sie:
$ 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
Dies ist auf Macos mit einem Dateisystem, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird . (Ich weiß nicht, dass dies relevant ist.) Auf dem Host, auf dem dies auftritt, gibt es ein Docker-Image, auf dem Debian mit demselben gemounteten Verzeichnis ausgeführt wird, und im Docker-Image tritt das entgegengesetzte Verhalten auf:
$ 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
Um klar zu sein, lautet die hier ausgeführte Befehlsfolge: git diff-index
auf dem Docker-Image (gibt 0 zurück), git diff-index
auf dem Host (gibt 1 zurück), git status
auf dem Host, git diff-index
auf dem Host (gibt 0 zurück) , git diff-index
auf dem Docker-Image (gibt 1 zurück).
Wenn ich git-status
in einer Umgebung ausführe, git diff-index
wird in dieser Umgebung erfolgreich sein (0 zurückgeben) und in der anderen fehlschlagen. Irgendwelche Gedanken darüber, was los ist? Dies ist keine große Sache, und ich habe den Verdacht, dass dies der Fall ist Die Unempfindlichkeit des Dateisystems ist schuld, aber ich würde eine solide Erklärung lieben.
Antwort
Ich hatte eine ähnliches Problem mit und ich denke, die Ursache war dieselbe. Dies erfordert keine Docker- oder Dateisysteme, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird. Dies kann das Problem jedoch verschlimmern.
Git verwaltet einen Cache mit Informationen über den Inhalt von Dateien. Normalerweise ist dies transparent und auf hoher Ebene Befehle wie git status
und git diff
aktualisieren den Cache nach Bedarf.
Befehle auf niedrigerer Ebene wie git diff-index
und git diff-files
liefern schnelle, aber ungefähre Ergebnisse. Sie aktualisieren den Cache nicht. Sie geben 0 zurück, wenn sie „sicher sind, dass die Dinge, die sie vergleichen“, identisch sind, aber wenn sie 1 zurückgeben, bedeutet dies nur „Ich bin mir nicht bewusst, dass die Dinge identisch sind“. Wenn die Cache-Einträge veraltet sind, ist es “ Es ist möglich, dass die Dinge identisch sind, aber git diff-xxx
weiß es nicht.
Ich weiß nicht genau, wie der Cache funktioniert. In Ihrem ersten Experiment hat der erste Aufruf von git diff-index
anscheinend festgestellt, dass der Cache-Eintrag veraltet war, und hat daher 1 für „Ich weiß nicht“ zurückgegeben. Dann git status
hat den Cache aktualisiert, und beim zweiten Aufruf von git diff-index
wurden gültige Cache-Einträge angezeigt, und es wurde festgestellt, dass die Dateien identisch sind. In Ihrem zweiten Experiment wurde ausgeführt git status
außerhalb des Docker-Containers scheint Cache-Einträge erstellt zu haben, die git diff-index
innerhalb des Containers als veraltet gelten, daher der zweite Aufruf von git diff-index
gab 1 für „Ich weiß nicht“ zurück.
Meine Lösung bestand darin, Befehle auf niedriger Ebene zu vergessen und bei git diff --quiet
.