Le problème du log restreint par chemin
git log -- path/to/file doit en principe parcourir chaque commit, faire un diff par rapport à son parent et émettre ceux qui ont touché path/to/file. Sur les gros repos cela est dominé par les comparaisons de tree. Les filtres Bloom de chemins changés (Git 2.27+) accélèrent dramatiquement.
Comment fonctionnent les filtres Bloom
Un filtre Bloom est un petit bitmap qui retourne "définitivement pas dans l'ensemble" ou "probablement dans l'ensemble". Les faux positifs sont possibles mais jamais de faux négatifs.
Activation
git commit-graph write --reachable --changed-paths
git config commitGraph.changedPathsVersion 2
git maintenance run --task=commit-graph
Vérifier
GIT_TRACE2_PERF=1 git log -- src/foo.c 2>&1 | grep -i bloom
git commit-graph verify
Quand ça brille
- Monorepo de longue durée avec beaucoup de commits qui ne touchent que peu de fichiers chacun.
- Requêtes
git log -- src/specific/dir. git blamesur fichiers individuels.
Quand ça n'aide pas
- Chemins glob/regex que le filtre ne peut pas matcher exactement.
- Logs sans argument de chemin
--. - Très petits repos.
Mémoire et disque
git config commitGraph.maxNewFilters 50000
Erreurs courantes
Écrire le graphe sans --changed-paths — les filtres ne sont pas ajoutés par défaut.