harkitse:

$ 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 

Tämä on Macosissa, joissa on kirjainkoon erottamaton tiedostojärjestelmä . (En tiedä, että sillä on merkitystä.) Isännässä, jossa tämä tapahtuu, on telakointikuva, joka suorittaa debiania, johon on asennettu sama hakemisto, ja telakointikuvassa tapahtuu päinvastainen toiminta:

$ 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 

Selvyyden vuoksi tässä suoritettujen komentojen järjestys on: git diff-index telakointikuvassa (palauttaa 0), git diff-index isännässä (palauttaa 1), git status isännässä, git diff-index isännässä (palauttaa 0) , git diff-index telakointikuvassa (palauttaa 1).

Jos suoritan git-status yhdessä ympäristössä, git diff-index onnistuu (palauttaa 0) kyseisessä ympäristössä ja epäonnistuu toisessa. Onko sinulla ajatuksia siitä, mitä tapahtuu? Tämä ei ole iso juttu, ja epäilen, että tapaus tiedostojärjestelmän epäherkkyys on syyllinen, mutta rakastan vankkaa selitystä.

Vastaus

Minulla on ollut samanlainen ongelma ja mielestäni syy oli sama. Tämän ei tarvitse liittää Docker-tiedostoja tai kirjainkoon merkitsemättömiä tiedostojärjestelmiä, vaikka ne saattavatkin pahentaa ongelmaa.

Git ylläpitää tiedostojen sisällön välimuistia. Normaalisti tämä on läpinäkyvää ja korkean tason komennot, kuten git status ja git diff päivitä välimuisti tarpeen mukaan.

Alemman tason komennot, kuten git diff-index ja git diff-files on suunniteltu palauttamaan nopeat mutta likimääräiset tulokset. Ne eivät päivitä välimuistia. He palauttavat 0, jos he ”ovat varmoja siitä, että vertaamansa asiat ovat identtisiä, mutta kun he palauttavat 1, kaikki tarkoittaa, että” en tiedä, että asiat ovat identtisiä ”. Jos välimuistimerkinnät ovat vanhentuneita, se” On mahdollista, että asiat ovat identtiset, mutta git diff-xxx ei tiedä.

En tiedä tarkalleen, kuinka välimuisti toimii. Ensimmäisessä kokeessasi näyttää siltä, että ensimmäinen puhelu numeroon git diff-index huomasi, että välimuistimerkintä oli vanhentunut, ja palautti siten arvon 1 ”En tiedä”. Sitten git status päivitti välimuistin, ja toinen puhelu henkilölle git diff-index näki kelvolliset välimuistimerkinnät ja pystyi päättelemään, että tiedostot ovat identtisiä. Toisessa kokeessa suoritat git status Docker-säilön ulkopuolella näyttää luoneen välimuistimerkinnät, jotka git diff-index säilön sisällä olevaan säilöön, joten toinen puhelu ryhmälle git diff-index palautti yhden sanalle ”en tiedä”.

Ratkaisuni oli unohtaa matalan tason komennot ja pysyä git diff --quiet.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *