git prune Nedir?
git prune komutu, yerel depoda artık ihtiyaç duyulmayan nesneleri kaldırmak için kullanılır. Bu nesneler; commit’ler, ağaçlar (dizin anlık görüntüleri), blob’lar (dosyalar) ve depodaki herhangi bir dal veya etiketten artık erişilemeyen etiketler olabilir.
Kısacası, git prune depodaki gereksiz dosya ve verileri temizleyerek alan kazandırır ve dağınıklığı azaltır.
Nesneler nasıl erişilemez hale gelir?
Nesneler birden fazla yolla erişilemez hale gelebilir — örneğin, dalların silinmesi veya commit’lerin yeniden yazılmasıyla. Dallar silindiğinde, yalnızca o dallara özgü olup başka hiçbir dal veya etiketin parçası olmayan commit’ler erişilemez olur.
git rebase gibi komutlarla commit yeniden yazma, yeni commit’ler üretir ve eskilerini atar; bu da onların erişilemez hale gelmesine yol açar.
Mühlet süresi ve reflog’lar
Git, dal uçlarına ve diğer referanslara yapılan güncellemelerin kaydını reflog (reference log) adıyla tutar. Bunu git reflog komutuyla görüntüleyebiliriz.
Bir nesne erişilemez olsa bile, eğer hâlâ reflog’da yer alıyorsa git prune tarafından silinmez.
Varsayılan olarak reflog’un son kullanma süresi 90 gündür; bu da erişilemeyen nesnelerin geçici olarak saklandığı ve hemen budanmadığı bir mühlet sağlar.
git prune Ne Zaman Kullanılır?
Genel olarak, git prune’u doğrudan kullanmamız gerekmez. Git, bazı komutlardan sonra otomatik olarak çalışan ve gereksiz dosyaları temizleyip yerel deponun verimliliğini bazı dosyaları sıkıştırarak optimize eden bir çöp toplama mekanizmasına sahiptir.
Yine de, aşağıdaki gibi durumlarda depomuzu elle temizlemek isteyebiliriz:
- Bir dal silme gibi erişilemeyen nesneler oluşturacağını bildiğimiz bir işlem yaptıktan sonra.
- Disk alanını hemen temizlemek istediğimizde.
- Depoyu her zaman düzenli ve temiz tutmak istediğimizde.
git gc ile çöp toplama
Doğrudan budama yerine genellikle çöp toplama mekanizmasına güvenilmesi önerilir; bu mekanizma yalnızca git prune yapmakla kalmaz, aynı zamanda nesneleri sıkıştırarak alanı da optimize eder.
Yukarıda belirtildiği gibi, çöp toplama bazı komutlardan sonra otomatik olarak çalıştırılır. Çöp toplamayı şu komutla elle de çağırabiliriz:
git gc
git prune Nasıl Kullanılır
git prune veri sileceği için, önce --dry-run seçeneğiyle çalıştırılması önerilir.
git prune --dry-run
Bu seçenek, aslında budama yapmadan budanacak nesneleri listeler. Çıktı aşağıdakine benzer görünecektir:
0d7dff8258654c03a058987b3e63c86feca9200d commit
ea1380f52f0bfa0142e46767adfd56593681091a blob
fa91af78a1ab453c1d7632192b3ca8bf217ec711 commit
Çıktı, erişilemeyen ve silinecek iki commit ve bir blob olduğunu gösterir. Önemli hiçbir verinin listelenmediğinden emin olduktan sonra temizliğe devam edebiliriz:
git prune
Bazı durumlarda, bir dal silme gibi erişilemeyen nesnelere yol açacağını bildiğimiz bir işlemi yaptıktan hemen sonra depoyu temizlemek isteyebiliriz. git prune --dry-run çalıştırabiliriz, ancak çıktı boş gelebilir. Bunun nedeni, silinen commit’lerin hâlâ reflog’da referanslanıyor olmasıdır.
Onların reflog’dan silinmesini beklemek istemiyorsak, aşağıdaki komutla elle zaman aşımına uğratabiliriz:
git reflog expire --expire-unreachable=now --all
Kullandığımız seçenekleri açıklayalım:
--expire-unreachable=nowseçeneği, tüm erişilemeyen nesnelerin son kullanma süresini “şimdi” olarak ayarlayarak onları anında zaman aşımına uğratır.--allseçeneği depodaki tüm reflog girdilerini hedefler. Bu seçenek olmadan, üzerinde işlem yapmak istediğimiz belirli bir referansı (örneğin bir dal veya etiket) belirtmemiz gerekirdi.
git prune: İleri Düzey Kullanım
Bir son kullanma zamanı belirtme veya paketlenmiş dosyaları budama gibi bazı ileri tekniklere göz atalım.
Son kullanma zamanı belirtme
Yalnızca daha eski erişilemeyen nesneleri temizlemek isteyebiliriz; örneğin, en az iki haftalık nesneleri budamak.
--expire <time> seçeneği, bir eşik zamanı belirtmemize olanak tanır. Git, belirtilen süreden daha uzun süredir erişilemeyen nesneleri kaldırır. <time> parametresi, esnek bir biçimde “2 weeks ago”, “3 days”, “yesterday” vb. formatları kabul eder.
Örnek komut:
git prune --expire=2.weeks.ago
Paketlenmiş dosyaları budama
Git nesneleri iki ana şekilde depolar: tekil dosyalar (gevşek nesneler) ve paketlenmiş dosyalar. Paketleme, birden fazla nesneyi tek bir dosyada saklayıp fazlalıkları kaldırarak alan kazandıran ve performansı artıran bir mekanizmadır.
Bazen bir nesne hem gevşek hem de paketlenmiş biçimde bulunabilir. Bu fazlalık zararlı olmasa da (biraz ekstra disk alanı kaplaması dışında), alanı geri kazanmak için paketlenmiş olan bu gevşek nesneleri temizlemek isteyebiliriz.
git prune-packed komutu, zaten bir pakete dahil edilmişse gevşek nesneleri kaldırır. git prune’un aksine, git prune-packed --expire <time> gibi seçenekler almaz. Sadece halihazırda paketlenmiş olan gevşek nesneleri temizler.
Sonuç
Bir depoyu kullandıkça bazı nesneler erişilemez hale gelir ve gereksiz disk kullanımına neden olur. Git, belirli bir süre hareketsizlikten sonra erişilemeyen nesneleri silen bir çöp toplama sistemiyle bunu yönetir.
Çöp toplama mekanizması, Git tarafından bazı komutlardan sonra otomatik olarak çalıştırılır. Ancak git gc komutunu kullanarak bunu elle de çalıştırabiliriz. Çöp toplama süreci, git prune ile erişilemeyen nesneleri kaldırmakla kalmaz, bazı nesneleri sıkıştırarak disk alanını da optimize eder.
İleri düzey Git kullanıcıları depoyu elle temiz ve düzenli tutmak isteyebilir. git prune komutu, erişilemeyen nesneleri el ile silmeye olanak tanır. Budama işleminde silinecek nesnelere genel bir bakış elde etmek için git prune çalıştırmadan önce her zaman git prune --dry-run çalıştırmalıyız.


Git’in veri silmeye yönelik korumacı yaklaşımı, önemli commit’lerin veya verilerin kazara kaybedilmesini önler.
Ancak bu durum, silinmiş dallara ait başvurular gibi güncelliğini yitirmiş verilerin görünür kalmasına yol açabilir. Zamanla, Git depoları başvurulmayan nesneler biriktirerek gereksiz disk alanı tüketebilir ve potansiyel olarak kafa karışıklığına neden olabilir.
git prunekomutu, öncelikle depodaki erişilemeyen nesneleri temizlemek için tasarlanmış bir Git bakım aracıdır.Erişilemeyen bir nesne; hiçbir dal, etiket, uzak izleme dalı veya başka bir referans tarafından erişilemeyen nesnedir. Bu nesneler depoda yer kaplayarak zaman içinde gereksiz verilerle karmaşaya yol açabilir.
git prune, depoları yalın tutmak için güçlü bir araç olsa da, çoğu kullanıcı Git’in otomatik çöp toplama (git gc) mekanizması sayesinde bunu doğrudan kullanmak zorunda kalmaz. Yine de, rolünü ve işlevini anlamak, gelişmiş Git kullanıcıları için veya el ile depo bakımı gereken ya da tercih edilen belirli senaryolarda faydalı olabilir.