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
.