ia în considerare:
$ 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
Aceasta este pe Mac-uri cu un sistem de fișiere care să nu distingă majusculele și minusculele . (Nu știu că acest lucru este relevant.) Pe gazda unde apare acest lucru, există o imagine de andocare care rulează debian cu același director montat, iar în imaginea de andocare apare comportamentul opus:
$ 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
Pentru a fi clar, succesiunea comenzilor executate aici este: git diff-index
pe imaginea de andocare (returnează 0), git diff-index
pe gazdă (returnează 1), git status
pe gazdă, git diff-index
pe gazdă (returnează 0) , git diff-index
pe imaginea de andocare (returnează 1).
Practic, dacă rulez git-status
într-un mediu, git diff-index
va reuși (returnează 0) în acel mediu și va eșua în celălalt. Ai vreo gândire despre ce se întâmplă? Nu este o problemă importantă și am suspiciunea că cazul vina insensibilității sistemului de fișiere, dar „mi-ar plăcea o explicație solidă.
Răspuns
Am avut o problemă similară cu și cred că cauza a fost aceeași. Acest lucru nu trebuie să implice Docker sau sisteme de fișiere care nu disting majusculele și minusculele, deși acestea pot agrava problema.
Git păstrează o memorie cache de informații despre conținutul fișierelor. În mod normal, acesta este transparent și la nivel înalt. comenzi precum git status
și git diff
actualizează memoria cache după cum este necesar.
Comenzi de nivel inferior precum git diff-index
și git diff-files
sunt concepute pentru a furniza rezultate rapide, dar aproximative. Nu actualizează memoria cache. Ele returnează 0 dacă sunt „siguri că lucrurile pe care le compară sunt identice, dar atunci când returnează 1, tot ceea ce înseamnă este„ Eu ”nu știu că lucrurile sunt identice”. Dacă intrările cache sunt vechi, este „ Este posibil ca lucrurile să fie identice, dar git diff-xxx
nu știe.
Nu știu exact cum funcționează cache-ul. În primul dvs. experiment, se pare că primul apel către git diff-index
a observat că intrarea în cache era învechită și a returnat 1 pentru „Nu știu”. Apoi git status
a actualizat memoria cache, iar al doilea apel către git diff-index
a văzut intrări cache valide și a reușit să concluzioneze că fișierele sunt identice. În al doilea experiment, rulați git status
în afara containerului Docker pare să fi creat intrări cache care git diff-index
în interiorul containerului considerat ca fiind învechit, deci al doilea apel către git diff-index
a returnat 1 pentru „Nu știu”.
Soluția mea a fost să uit de comenzile de nivel scăzut și să rămân la git diff --quiet
.