In che modo git rileva che un file è stato modificato?

In che modo Git rileva una modifica del file così velocemente?

Ha cancellato tutti i file nel repository e confronta gli SHA1? Questo richiederebbe molto tempo, no?

O confronta atime , ctime o mtime ?

Git fa fatica a convincersi dal solo valore di lstat () che il worktree corrisponde all’indice, perché il rientro sui contenuti dei file è molto costoso.

Documentazione / tecnica / racy-git.txt descrive quali campi di statistica vengono utilizzati e come si evitano alcune condizioni di competizione dovute a una bassa granulosità di mtime. Questo articolo ha alcuni dettagli in più .

i valori statistici non sono a prova di manomissione, vedere i futuri (3). Git può essere ingannato nel perdere una modifica a un file; ciò non compromette l’integrità dell’hash del contenuto.

C’è un controllo mtime iniziale per i rapporti come “git status”, ma quando il commit finale è calcolato, i minuti non contano … è lo SHA1 che conta.

Beh, azzarderei a indovinare che sta usando una combinazione di chiamate stat() per capire cosa potrebbe essere cambiato, quindi a sua volta legarsi per accertare usando il suo motore diverso che è così.

Puoi vedere il codice per il motore diff qui per avere qualche idea. Ho rintracciato la base di codice per essere sicuro che il comando di stato richiama effettivamente questo codice (sembra un sacco di cose!) E in realtà tutto questo ha molto senso quando sai che Git si comporta abbastanza male su Windows dove sta usando un livello di emulazione per eseguire queste chiamate di tipo POSIX: è un ordine di grandezza più lento a fare uno git status su quella piattaforma.

Ad ogni modo, a meno di leggere tutto il codice da cima a fondo (cosa che potrei più tardi se avrò il tempo!) Questo è il massimo che posso portarti per ora … forse qualcuno può essere più definitivo se hanno lavorato con il codebase.

Nota: un’altra ansible accelerazione deriva dall’uso giudizioso delle funzioni inline cui ha chiaramente un senso, è ansible vederlo chiaramente nelle intestazioni.

[modifica: vedi qui per una spiegazione di stat() ]

A seconda della piattaforma, dovresti essere in grado di scoprire quali syscalls utilizza Git per capire il suo stato. Prova a utilizzare lo strace git status su Linux, lo stato truss git status su SunOS o lo strumento apparentemente basato su DTrace fornito da Apple con gli Strumenti per sviluppatori su Mac OS X.