Il problema dell'attraversamento status
git status confronta il working tree con l'index, attraversando le info stat di ogni file tracciato. Su un repo da un milione di file questo puo prendere secondi. Fsmonitor usa le notifiche di cambio file del sistema operativo (FSEvents su macOS, ReadDirectoryChangesW su Windows, inotify su Linux).
Daemon integrato (Git 2.36+)
git config core.fsmonitor true
git fsmonitor--daemon start
git fsmonitor--daemon status
git fsmonitor--daemon stop
Integrazioni esterne
git config core.fsmonitor /path/to/hook
git config core.fsmonitorHookVersion 2
Verifica
GIT_TRACE2_PERF=1 git status 2>&1 | grep fsmonitor
git fsmonitor--daemon status
git update-index --fsmonitor
Untracked cache
git config core.untrackedCache true
Numeri di performance
Su un monorepo da 4 milioni di file, git status scende da 5+ secondi a meno di 200ms.
Errori comuni
Abilitare fsmonitor senza untracked cache — solo meta vittoria.
Caveat per piattaforma
- macOS: FSEvents e affidabile.
- Windows: ReadDirectoryChangesW.
- Linux: limiti inotify (
fs.inotify.max_user_watches).
sudo sysctl fs.inotify.max_user_watches=524288