Nel caso in un repository git si stiano gestendo file di grandi dimensioni, come per esempio immagini e video, una loro rimozione in un successivo commit non aiuterà nella riduzione dello spazio occupato.
Siccome git è progettato con la finalità di tenere traccia della storia dei file caricati, questi, in caso di eliminazione non verranno completamente eliminati.
Nella seguente procedura vedremo quindi come eliminare completamente i file dal proprio repository.
Trovare i file più ingombranti nel repository
Utilizziamo il seguente comando per trovare e visualizzare in ordine di dimensione i 10 file che occupano più spazio nel repository. Dove eseguiamo il tail possiamo eventualmente modificare il numero di file che vogliamo elencare.
git rev-list --objects --all | grep -f <(git verify-pack -v .git/objects/pack/*.idx| sort -k 3 -n | cut -f 1 -d " " | tail -10)
Pulire l'history dai file di grandi dimensione
Per ogni commit, il comando filter-branch riscrive l’history del repository con un filtro. Il seguente comando cancella le immagini (x. es .jpg, .png, .gif) che sono presenti nell’history.
git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch "assets/*.jpg" "assets/*.png" "assets/*.gif"' --prune-empty --tag-name-filter cat -- --all
Questo comando forza (-f) l’applicazione del filtro (la stringa indicata dopo –index-filter), rimuove i commit vuoti (–prune-empty) riscritti dal filtro e sovrascrive il nome del tag (–tag-name-filter cat) nel nuovo commit per la lista dei commit object (– –all)
Ripulire il repository
Rimuoviamo i log e gli oggetti per i vecchi commit che non sono più referenziati nel commit che abbiamo riscritto.
rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc --aggressive --prune=now
Aggiornare il repository remoto
Non resta che eseguire il push delle modifiche al server remoto di git.
git push origin --force --all
git push origin --force --tags