Ne yaptığımı anlamak için birkaç cevap ve başka bilgileri okumam gerekiyordu.
1. Belirli bir işlemden daha eski olan her şeyi yoksay
Dosya .git/info/grafts
, bir taahhüt için sahte ebeveynleri tanımlayabilir. Yalnızca taahhüt kimliğine sahip bir satır, taahhüdün bir ebeveyni olmadığını söylüyor. Sadece son 2000 taahhüdünü önemsediğimizi söylemek istersek şunu yazabiliriz:
git rev-parse HEAD~2000 > .git/info/grafts
git rev-parse bize şu anki taahhüdün 2000. ebeveyninin taahhüt kimliğini verir. Yukarıdaki komut, varsa greft dosyasının üzerine yazacaktır. Önce orada olup olmadığını kontrol edin.
2. Git geçmişini yeniden yazın (isteğe bağlı)
Bu aşılanmış sahte ebeveynin gerçek olmasını istiyorsanız, çalıştırın:
git filter-branch -- --all
Tüm taahhüt kimliklerini değiştirecektir. Bu deponun her kopyası zorla güncellenmelidir.
3. Disk alanını temizleyin
2. adımı ben yapmadım çünkü kopyamın yukarı akışla uyumlu kalmasını istedim. Sadece disk alanından tasarruf etmek istedim. Tüm eski taahhütleri unutmak için:
git prune
git gc
Alternatif: sığ kopyalar
Başka bir deponun sığ bir kopyasına sahipseniz ve sadece disk alanından tasarruf etmek istiyorsanız, güncelleyebilirsiniz .git/shallow
. Ancak, hiçbir şeyin daha önce bir taahhüde işaret etmediğine dikkat edin. Böylece şöyle bir şey çalıştırabilirsiniz:
git fetch --prune
git rev-parse HEAD~2000 > .git/shallow
git prune
git gc
Sığ giriş bir greft gibi çalışır. Ancak aynı zamanda greft ve sığ kullanmamaya dikkat edin. En azından orada aynı girişler yok, başarısız olacak.
Hala eski işlemlere işaret eden bazı eski referanslarınız (etiketler, dallar, uzak kafalar) varsa, bunlar temizlenmez ve daha fazla disk alanı kazanmazsınız.
git filter-branch --tag-name-filter cat -- --all
Etiketleri güncellemek zorunda kaldım . Ancak silmek istediğim eski tarihe işaret eden eski etiketlerim de var. Tüm bu eski etiketlerden nasıl kurtulabilirim? Onları silmezsem, eski tarih kaybolmaz ve hala görebiliyorumgitk --all
.