Sinossi
git filter-repo --path <path> [--invert-paths]
git filter-repo --replace-text <file>
git filter-repo --strip-blobs-bigger-than 10M
Descrizione
Lo strumento git filter-repo è il modo moderno e raccomandato per riscrivere la storia Git. Sostituisce il deprecato git filter-branch, che è lento e soggetto a errori. filter-repo può eliminare file grandi, rimuovere dati sensibili (credenziali committate per errore), ristrutturare path, riscrivere autori via mailmap o estrarre sottodirectory nel proprio repository.
È distribuito separatamente dal Git core (tipicamente via pip install git-filter-repo o il tuo gestore di pacchetti). Le operazioni sono distruttive — lavora sempre su un clone fresco e coordinati con i collaboratori perché ogni SHA cambia.
Nell'uso quotidiano, git filter-repo si integra con alias e CI.
Capire il modello dati di Git aiuta a prevedere i risultati.
Opzioni comuni
| Opzione | Descrizione |
|---|---|
--path <p> | Mantiene solo il path specificato. |
--invert-paths | Inverso: rimuove i path specificati. |
--path-glob <g> | Usa un pattern glob. |
--replace-text <file> | Sostituisce stringhe in tutta la storia. |
--strip-blobs-bigger-than <size> | Elimina blob grandi. |
--mailmap <file> | Riscrive info author/committer. |
--analyze | Produce un report sulla dimensione del repo prima della riscrittura. |
--force | Sovrascrive il controllo di sicurezza fresh-clone. |
Esempi
git filter-repo --analyze
# Ispeziona cosa sta consumando spazio
git filter-repo --path docs/ --invert-paths
# Rimuove docs/ da tutta la storia
git filter-repo --strip-blobs-bigger-than 50M
# Elimina qualsiasi file sopra 50 MB
echo 'API_KEY==>REDACTED' > replacements.txt
git filter-repo --replace-text replacements.txt
# Cancella un segreto trapelato
Errori comuni
Eseguire filter-repo nel tuo repo live senza un backup rischia di perdere dati. Clona sempre fresh. Dopo la riscrittura, fai force-push e fai re-clone ai collaboratori — chiunque abbia vecchi SHA otterrà conflitti. Lo strumento rimuove origin per default per prevenire push accidentali; aggiungilo di nuovo deliberatamente.
Comandi correlati
git filter-branch (deprecato), git gc, git reflog, git push --force-with-lease