Curățarea Istoriei și Ștergerea Fișierelor Secrete cu git-filter-repo în Git

Anulare și recuperare Extensie Oficială Modernă

Ghid complet pentru instrumentul modern git-filter-repo: eliminarea definitivă a cheilor private și a parolelor din tot istoricul Git și micșorarea depozitelor umflate de fișiere mari.

Sintaxă comandă
git filter-repo --path fisier.env --invert-paths | --strip-blobs-bigger-than 50M

Un scenariu de panică frecvent: un dezvoltator a comis din greșeală un fișier .env cu chei private AWS sau parole de baze de date, iar apoi a dat git push. Ștergerea fișierului printr-un nou commit (git rm .env && git commit) nu rezolvă problema de securitate, deoarece fișierul rămâne salvat pentru totdeauna în istoricul commit-urilor anterioare! Utilitarul modern recomandat oficial de comunitatea Git este git-filter-repo (înlocuitorul rapid al vechiului git filter-branch).

1. Ștergerea definitivă a unui fișier secret din tot istoricul
# Instalați instrumentul (scris în Python):
pip install git-filter-repo

# ATENȚIE: Lucrați întotdeauna pe o clonă proaspătă de siguranță!
git clone --bare git@github.com:firma/proiect.git proiect-backup.git

# Șterge complet fișierul '.env' din fiecare commit, tag și ramură din istorie:
git filter-repo --path .env --invert-paths

# Rescrierea se finalizează în sub 2 secunde chiar și pe depozite de zeci de mii de commit-uri!

2. Micșorarea Depozitelor: Eliminarea Fișierelor Uriașe

Dacă cineva a adăugat în trecut arhive zip sau videoclipuri de 200 MB care au umflat folderul .git la câțiva gigaocteți, le puteți curăța automat:

Eliminarea tuturor fișierelor mai mari de 50 MB din istorie
# Elimină orice fișier istoric a cărui dimensiune depășește 50 MB:
git filter-repo --strip-blobs-bigger-than 50M

# Forțează curățarea internă imediată a bazei de date de obiecte:
git reflog expire --expire=now --all
git gc --prune=now --aggressive

Actualizarea Serverului Remote (Push Forțat)

Deoarece git-filter-repo rescrie hash-urile tuturor commit-urilor modificate, actualizarea serverului central necesită un push forțat:

git push origin --force --all
git push origin --force --tags

Informați întreaga echipă să facă o clonă nouă a depozitului după această operațiune pentru a evita reintroducerea commit-urilor vechi!