zvažte:

$ 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 

Toto je v systému MacOS se souborovým systémem nerozlišujícím velká a malá písmena . (Nevím, že je to relevantní.) Na hostiteli, kde k tomu dojde, je ukotvený obraz ukotvitelného systému běžící na debian se stejným připojeným adresářem a v ukotvitelném obrazu dochází k opačnému chování:

$ 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 

Aby bylo jasno, posloupnost provedených příkazů je zde: git diff-index na ukotvitelném obrázku (vrací 0), git diff-index na hostiteli (vrátí 1), git status na hostiteli, git diff-index na hostiteli (vrátí 0) , git diff-index na ukotvitelném obrázku (vrátí 1).

V zásadě, když spustím git-status v jednom prostředí, git diff-index uspěje (vrátí 0) v tomto prostředí a selže v druhém. Nějaké myšlenky o to, co se děje? To není velký problém a mám podezření, že případ je na vině necitlivost souborového systému, ale já bych rád pevné vysvětlení.

Odpověď

Měl jsem podobný problém s a myslím, že příčina byla stejná. To nemusí zahrnovat Docker nebo souborové systémy, které nerozlišují velká a malá písmena, i když by to mohlo problém zhoršit.

Git udržuje mezipaměť informací o obsahu souborů. Obvykle je to transparentní a na vysoké úrovni příkazy jako git status a git diff podle potřeby aktualizovat mezipaměť.

Příkazy nižší úrovně jako git diff-index a git diff-files jsou navrženy tak, aby poskytovaly rychlé, ale přibližné výsledky. Mezipaměť neaktualizují. Vrátí 0, pokud si jsou „jisti, že věci, které porovnávají, jsou identické, ale když vrátí 1, znamená to jen„ Nevím, že věci jsou identické “. Pokud jsou položky mezipaměti zastaralé, je to“ Je možné, že věci jsou totožné, ale git diff-xxx to nevím.

Nevím přesně, jak mezipaměť funguje. Ve vašem prvním experimentu se zdá, že první volání git diff-index si všimlo, že položka mezipaměti byla zastaralá, a proto vrátila 1 za „nevím“. Potom git status aktualizoval mezipaměť a druhé volání git diff-index vidělo platné položky mezipaměti a mohlo dojít k závěru, že soubory jsou identické. Ve druhém experimentu běží Zdá se, že git status mimo kontejner Dockeru vytvořil položky mezipaměti, které git diff-index uvnitř kontejneru považují za zastaralé, takže druhé volání git diff-index vrátil 1 pro „nevím“.

Mým řešením bylo zapomenout na nízkoúrovňové příkazy a držet se git diff --quiet.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *