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
.