Yanlışlıkla commit'lenen bir .env dosyası ya da API anahtarı, sadece son sürümden silseniz bile tüm geçmişte durmaya devam eder. git-filter-repo ile geçmişten kalıcı olarak nasıl temizlenir ve sonrasında ne yapılmalı?
Bir API anahtarını, veritabanı parolasını ya da .env dosyasını yanlışlıkla depoya gönderdiğinizi fark ettiniz. İlk refleks dosyayı silip yeni bir commit atmaktır — ama bu yetmez. Git bir geçmiş sistemidir: sır, önceki commit'lerin içinde durmaya devam eder ve depoyu klonlayan herkes ona ulaşabilir. Bu rehberde sızan bir sırrı geçmişten kalıcı olarak nasıl temizleyeceğinizi ve sonrasında ne yapmanız gerektiğini adım adım anlatıyoruz.
Neden sadece silmek işe yaramaz?
Git her değişikliği commit'ler hâlinde saklar. Dosyayı bugün silseniz bile, anahtarı ekleyen eski commit tarih içinde kalır. git log ile birkaç adım geriye giden herkes onu okuyabilir. Bu yüzden çözüm, dosyayı içeren tüm commit'leri yeniden yazmaktır.
1) Sızan sırrı hemen iptal edin
İlgili panele girip anahtarı iptal edin ve yenisini üretin (AWS/Google Cloud konsolu, veritabanı kullanıcısı, üçüncü parti servis vb.). Bu adım atlanırsa, geçmişi ne kadar temizlerseniz temizleyin sızan anahtar kullanılabilir durumda kalır.
2) git-filter-repo kurun
Git'in resmî dokümantasyonunun da önerdiği araç git-filter-repo'dur; eski git filter-branch'tan çok daha hızlı ve güvenlidir. Python ile kurulur:
pip install git-filter-repo
# Kurulumu doğrulayın
git filter-repo --version3) Dosyayı tüm geçmişten kaldırın
Deponun temiz bir kopyasında çalışın (tercihen taze bir klon). Örneğin bir .env dosyasını tüm geçmişten silmek için:
git filter-repo --path .env --invert-paths--path hedef dosyayı belirtir; --invert-paths ise "bu yolu tut" yerine "bu yolu her yerden çıkar" anlamına gelir. Birden çok dosya için komutu birkaç --path ile tekrarlayabilirsiniz.
Yalnızca bir parolayı/metni temizleme
Bazen tüm dosya değil, dosyanın içinden geçen tek bir dize sorunludur. Bu durumda değiştirilecek metinleri bir dosyaya yazıp --replace-text kullanın:
# expressions.txt
SK_LIVE_1234567890abcdef==>***KALDIRILDI***
regex:AKIA[0-9A-Z]{16}==>***AWS_KEY_KALDIRILDI***git filter-repo --replace-text expressions.txtBu yöntem, aynı sır birçok commit ve dosyada geçiyorsa hepsini tek seferde maskeler.
4) Uzak depoyu güncelleyin
Geçmiş yeniden yazıldığı için commit kimlikleri değişir; uzak depoya zorla göndermeniz gerekir:
git push --force --all
git push --force --tags5) Temizlik sonrası kontrol listesi
- Sırrı (yine) rotate edin — sızıntı ile temizlik arasında geçen sürede kopyalanmış olabilir.
- GitHub/GitLab üzerinde fork ve önbelleğe alınmış görünümleri kontrol edin; gerekirse destekten temizlik isteyin.
- Dosyayı
.gitignore'a ekleyin ki bir daha eklenmesin. - Bir sır tarayıcı devreye alın:
gitleaksya datrufflehogile pre-commit kancası kurun. - Depo sağlayıcınızın gizli bilgi taraması (secret scanning) özelliğini açın.
Özet
Sızan bir sırrı yönetmenin sırası nettir: önce iptal et, sonra geçmişten temizle, en son yeniden iptal edip önlem al. git-filter-repo temizleme adımını hızlı ve güvenli hâle getirir; ama asıl koruma, sırların depoya hiç girmemesini sağlayan otomatik tarayıcılar ve .gitignore disiplinidir.