considera:

$ 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 

Questo è su macos con un file system senza distinzione tra maiuscole e minuscole . (Non so che sia rilevante.) Sullhost in cui si verifica ciò, cè unimmagine docker che esegue debian con la stessa directory montata, e nellimmagine docker si verifica il comportamento opposto:

$ 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 

Per essere chiari, la sequenza di comandi eseguiti qui è: git diff-index sullimmagine docker (restituisce 0), git diff-index sullhost (restituisce 1), git status sullhost, git diff-index sullhost (restituisce 0) , git diff-index nellimmagine docker (restituisce 1).

Fondamentalmente, se eseguo git-status in un ambiente, git diff-index avrà successo (restituirà 0) in quellambiente e fallirà nellaltro. Qualche idea su cosa sta succedendo? Non è “un grosso problema e ho il sospetto che il caso è da biasimare linsensibilità del file system, ma mi piacerebbe una spiegazione concreta.

Risposta

Ho “avuto un problema simile con e penso che la causa fosse la stessa. Non è necessario coinvolgere Docker o filesystem senza distinzione tra maiuscole e minuscole, sebbene questi possano aggravare il problema.

Git mantiene una cache di informazioni sul contenuto dei file. Normalmente, questo è trasparente e di alto livello comandi come git status e git diff aggiornano la cache secondo necessità.

Comandi di livello inferiore come git diff-index e git diff-files sono progettati per restituire risultati rapidi ma approssimativi. Non aggiornano la cache. Restituiscono 0 se “sono sicuri che le cose che” stanno confrontando siano identiche, ma quando restituiscono 1, tutto ciò che significa è “Non sono consapevole che le cose sono identiche”. Se le voci della cache sono obsolete, ” È possibile che le cose siano identiche ma git diff-xxx non “lo sa.

Non so esattamente come funziona la cache. Nel tuo primo esperimento, sembra che la prima chiamata a git diff-index abbia notato che la voce della cache era obsoleta e quindi ha restituito 1 per “Non lo so”. Quindi git status ha aggiornato la cache e la seconda chiamata a git diff-index ha visto voci di cache valide ed è riuscito a concludere che i file sono identici. Nel secondo esperimento, in esecuzione git status allesterno del contenitore Docker sembra aver creato voci della cache che git diff-index allinterno del contenitore considerate non aggiornate, quindi la seconda chiamata a git diff-index ha restituito 1 per “Non lo so”.

La mia soluzione era di dimenticare i comandi di basso livello e attenersi a git diff --quiet.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *