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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *