weź pod uwagę:
$ 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
Dotyczy macOS z systemem plików bez rozróżniania wielkości liter . (Nie wiem, czy to ma znaczenie.) Na hoście, na którym to się dzieje, jest obraz dockera z uruchomionym debianem z tym samym katalogiem, a na obrazie dockera występuje odwrotne zachowanie:
$ 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
Dla jasności, sekwencja wykonywanych tutaj poleceń jest następująca: git diff-index
na obrazie dockera (zwraca 0), git diff-index
na hoście (zwraca 1), git status
na hoście, git diff-index
na hoście (zwraca 0) , git diff-index
na obrazie dockera (zwraca 1).
Zasadniczo, jeśli uruchomię git-status
w jednym środowisku, git diff-index
odniesie sukces (zwróci 0) w tym środowisku, a zakończy się niepowodzeniem w innym. Jakieś myśli o tym, co się dzieje? To nie jest wielka sprawa i podejrzewam, że sprawa winę za niewrażliwość systemu plików, ale chciałbym uzyskać solidne wyjaśnienie.
Odpowiedź
Miałem podobny problem z i myślę, że przyczyna była taka sama. Nie musi to obejmować systemów plików Docker lub systemów plików bez rozróżniania wielkości liter, chociaż mogą one zaostrzyć problem.
Git przechowuje bufor informacji o zawartości plików. Zwykle jest to przejrzyste i wysokopoziomowe polecenia takie jak git status
i git diff
aktualizują pamięć podręczną w razie potrzeby.
Polecenia niższego poziomu, takie jak git diff-index
i git diff-files
mają zwracać szybkie, ale przybliżone wyniki. Nie aktualizują pamięci podręcznej. Zwracają 0, jeśli „są pewni, że rzeczy, które porównują, są identyczne, ale kiedy zwracają 1, oznacza to tylko, że„ nie wiem, czy te rzeczy są identyczne ”. Jeśli wpisy w pamięci podręcznej są nieaktualne, oznacza to Możliwe, że rzeczy są identyczne, ale git diff-xxx
nie wiem.
Nie wiem dokładnie, jak działa pamięć podręczna. W Twoim pierwszym eksperymencie wydaje się, że pierwsze wywołanie git diff-index
zauważyło, że wpis w pamięci podręcznej był nieaktualny, więc zwrócił 1 dla „Nie wiem”. Następnie git status
zaktualizował pamięć podręczną, a drugie wywołanie git diff-index
zobaczyło prawidłowe wpisy w pamięci podręcznej i było w stanie stwierdzić, że pliki są identyczne. W drugim eksperymencie uruchomiono Wygląda na to, że git status
poza kontenerem Dockera utworzył wpisy pamięci podręcznej, które git diff-index
wewnątrz kontenera uznano za przestarzałe, więc drugie wywołanie git diff-index
zwróciło 1 dla „Nie wiem”.
Moim rozwiązaniem było zapomnienie o poleceniach niskiego poziomu i trzymanie się git diff --quiet
.