Kritik Dosyalarınızı Git Reponuzdan Temizleyin
Merhaba arkadaşlar, bugün sizlerle yanlışlıkla git geçmişinize tutunmuş kritik dosyalarınızın nasıl temizleyeceğinizden bahsetmek istiyorum.
Git versiyonlama sistemi için .gitignore dosyası çok önemli, hatta git reposu oluştururkenki ilk aşamada .gitignore dosyasını özenle hazırlamak ve gerektiğinde güncellemek fazla önem arzediyor.
Şimdi bir demo eşliğinde durumu ve çözüm adımlarını beraber işleyelim.
- Öncelikle bir dizin oluşturup içerisinde Git versiyonlama sistemini başlatalım.
$ mkdir demo
$ cd demo
$ git init
- İkinci aşamada birkaç dizin ve içerisinde herkese açık olmasını istemediğimiz password.txt dosyasını ekleyelim.
$ mkdir firstLevelDir
$ cd firstLevelDir
$ mkdir secondLevelDir
$ cd secondLevelDir
$ touch password.txt
- password.txt içerisinde sizin için kritik öneme sahip bir şifre bulunduğunu varsayalım. Şimdi ilk commit işlemini gerçekleştirelim.
$ cd demo
$ git add .
$ git commit -m "First commit"
- İlk commit işleminden sonra şimdi kritik öneme sahip olmayan bir dosya daha ekleyelim nonPassword.txt ve ikinci commit işlemini gerçekleştirelim.
$ git add .
$ git commit -m "Second commit"
- Sonraki aşamada nonPassword.txt içerisine yeni birşeyler ekleyelim ve bir kez daha commit işlemi gerçekleştirelim.
$ git add .
$ git commit -m "Last commit"
Son commit işleminden sonra git log işlettiğimizde aşağıdakine benzer bir sonuç alacağız.
commit 73203300643427afc0f8304d25b8912af50b6771
Author: Rahman Usta <rahmanusta@kodedu.com>
Date: Thu Jul 10 11:40:08 2014 +0000
Last commit
commit 8cedbe71a99194eb88c89728240c0f251f5dafa1
Author: Rahman Usta <rahmanusta@kodedu.com>
Date: Thu Jul 10 11:38:21 2014 +0000
Second commit
commit 70f2fd0eb2c1a0713917fc4ef2e85ec8b7fe0efb
Author: Rahman Usta <rahmanusta@kodedu.com>
Date: Thu Jul 10 11:35:44 2014 +0000
First commit
Şimdi bin eyvah etme vakti geldi 🙂 Malesef şifrenizi içeren bir dosyayı git geçmişinizde tutmuş oldunuz. Peki henüz herşey geç olmadan bu dosyayı nasıl temizleyeceksiniz?
İlk akla gelen şu olabilir, “password.txt dosyanın silinmesi ve yeni bir commit işleminin daha yapılması”.
Fakat bu biçimde sadece 4. ve sonraki revizyonlarda password.txt dosyasını geçmişinizde tutmamış olacaksınız, ilk üç revizyonda ise dosyanız hala bulunuyor olacak. Yani git geçmişine bakan herhangi biri bu dosyaya erişebiliyor olacak.
Peki çözüm nedir?
Çözüm için git filter-branch komutu ve BFG Repo-Cleaner aracı kullanılabilir.
Çözüm 1 : (git filter-branch)
$ cd demo
$ git filter-branch --force --index-filter "git rm --cached --ignore-unmatch firstLevelDir/secondLevelDir/password.txt" --prune-empty --tag-name-filter cat -- --all
Bu haliyle firstLevelDir/secondLevelDir/password.txt dosyasını Git geçmişinizden silip süpürmüş olacaksınız. Bu komut bütününü işlettiğinizde aşağıdaki gibi bir çıktı göreceksiniz.
Rewrite 70f2fd0eb2c1a0713917fc4ef2e85ec8b7fe0efb (1/3)rm 'firstLevelDir/secondLevelDir/password.txt'
Rewrite 8cedbe71a99194eb88c89728240c0f251f5dafa1 (2/3)rm 'firstLevelDir/secondLevelDir/password.txt'
Rewrite 73203300643427afc0f8304d25b8912af50b6771 (3/3)rm 'firstLevelDir/secondLevelDir/password.txt'
Ref 'refs/heads/master' was rewritten
Görüldüğü üzere 3 revizyonda da password.txt silinmiş oldu.
Şimdi sunucunuzdaki geçmişi lokal geçmişiniz ile güncellemelisiniz.
git push origin master --force
Çözüm 2 : (BFG Repo-Cleaner)
BFG Repo-Cleaner Java ile yazılmış bir araçtır. BFG ile kolay bir biçimde Git geçmişinizde olmasını istemediğiniz dosyaları temizleyebilirsiniz.http://rtyley.github.io/bfg-repo-cleaner/ bağlantısından bfg.jar indirerek BFG’yi kullanmaya başlayabilirsiniz.
$ cd demo
$ java -jar bfg.jar --delete-files password.txt
Bu iki yöntemle de password.txt dosyasını Git geçmişinden temizlemiş oluyoruz.
Referanslar
Tekrar görüşmek dileğiyle.