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.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *