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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.