26 puan yazan GN⁺ 2026-02-21 | 4 yorum | WhatsApp'ta paylaş
  • Eski Git branch temizleme sorununu çözmek için basit bir komutun CIA’in dahili geliştirme belgelerinde bulunduğu ortaya çıktı
    git branch --merged | grep -v "\*\|master" | xargs -n 1 git branch -d
  • Bu komut, git branch --merged çıktısından mevcut branch’i ve master’ı hariç tutup birleştirilmiş branch’leri topluca siliyor
  • Modern projelere uyacak şekilde main ve develop branch’lerini hariç tutan sürümü de var
  • Git alias olarak kaydedilip tekrar eden işleri otomatikleştirmek için kullanılabiliyor; basit ama sürekli iş verimliliği artışı ve depo düzeni için faydalı bir araç

Vault7’de bulunan Git ipucu

  • WikiLeaks’in 2017’de yayımladığı Vault7 belgeleri, CIA’in hack araçlarını ve dahili geliştirme belgelerini içeriyordu
    • Bunlardan bir sayfada Git ipuçları ve püf noktaları derlemesi vardı; çoğu sıradan commit düzeltme, stash ve bisect kullanımına ilişkindi
  • Bu belgede bulunan tek satırlık komutlardan biri bugün hâlâ ~/.zshrc dosyamda duruyor

Eski branch’leri temizleme sorunu

  • Yerel Git deposunda zamanla birleştirilmiş branch’ler birikiyor ve temizlik zorlaşıyor
    • Özellik branch’leri, hotfix’ler ve deneysel branch’ler birleştirildikten sonra da kaldığı için git branch listesi karmaşıklaşıyor
  • Birleştirilmiş branch’leri git branch --merged ile görmek mümkün, ancak elle silmek uğraştırıcı

CIA belgesindeki özgün komut

  • Verilen özgün komut şu şekilde
    git branch --merged | grep -v "\*\|master" | xargs -n 1 git branch -d  
    
  • Bileşen açıklamaları
    • git branch --merged: Geçerli branch’e birleştirilmiş tüm yerel branch’lerin listesini verir
    • grep -v "\*\|master": Mevcut branch’i (*) ve master’ı hariç tutar
    • xargs -n 1 git branch -d: Kalan branch’leri tek tek güvenli biçimde siler (-d, birleştirilmemiş branch’leri silmez)

Modernleştirilmiş komut sürümü

  • Projelerin çoğu main branch’ini kullandığı için komut şu şekilde uyarlanabiliyor
    git branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d  
    
  • Deploy sonrasında main branch’inde çalıştırıldığında onlarca branch’in birkaç taneye düştüğü görülebiliyor
  • Bu komut bir Git alias’ı olarak kaydedilerek kolayca çalıştırılabiliyor
    alias ciaclean='git branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d'  
    
    • Sonrasında depoda yalnızca ciaclean komutunu yazmak otomatik temizlik için yeterli oluyor

Verimlilik ve pratiklik

  • Bu komut, her hafta birkaç dakikalık zaman tasarrufu sağlıyor ve branch listesinin düzenli kalmasına yardımcı oluyor
  • Basit ama sürekli üretkenlik artışı sunan pratik bir araç olarak değerlendiriliyor

4 yorum

 
foriequal0 2026-02-21

HN yorumlarında, benim yaptığım programı kullandığını söyleyen biri varmış.

> Bunun için ben git-trim kullanıyorum:
> https://github.com/foriequal0/git-trim
> README'de ayrıca bunun bazı durumlarda neden tek satırlık bir bash komutundan daha iyi olduğu da açıklanıyor.
> https://news.ycombinator.com/item?id=47089533

 
youngminz 2026-02-21

Ben de git gone adında bir alias tanımlayıp kullanıyorum. Gerçekten çok kullanışlı.

  • alias.gone = ! git fetch -p && git for-each-ref --format '%(refname:short) %(upstream:track)' | awk '$2 == "[gone]" {print $1}' | xargs -r git branch -D
 
a1eng0 2026-02-21

Ben saf git kullanmıyorum ama temizleme için gh-poi adlı aracı kullanıyorum.

https://github.com/seachicken/gh-poi

 
GN⁺ 2026-02-21
Hacker News görüşleri
  • Ben dalları temizlemek için git tidy adlı bir alias kullanıyorum
    Varsayılan dalı (main, master) silmiyor; mevcut dalı ya da başka bir worktree'ye ait dalları da kurcalamıyor
    Uzaktan silinmiş dalları da otomatik olarak kaldırıyor; kodu dotfiles ayarlarımda var

    • init.defaultBranch kullanmak riskli. Her depo için varsayılan dal adı farklı olabilir ve bu ayar global olduğu için önceden belirlenmesi gerekir
      Ben git default adlı bir alias yapıp uzaktaki (origin) gerçek varsayılan dalı otomatik bulduruyorum
    • Bu script gerçekten faydalı; git extras'a katkı olarak eklenmesi güzel olurdu
  • Ben fzf ile entegre bir cleanup komutu kullanıyorum
    Birleşmiş dalları önceden seçip tek seferde silebiliyorsun; istersen bazılarını hariç de tutabiliyorsun
    Uzak dalları da birlikte temizliyor; kodu benim .gitconfig ayarımda var
    Ayrıca user.primaryBranch değişkeniyle depo bazında farklı varsayılan dallar tanımlıyorum

    • Bunun yerine init.defaultBranch da kullanılabilir diye düşünüyorum. Zaten başlatılmış depolarda bile git config --local init.defaultBranch main ile çalışıyor
    • Dal değiştirmeden başka bir daldan pull yapılabilir. Örneğin git pull origin main:main ardından git rebase main yeterli olur
  • git branch --merged, squash merge kullanan depolarda düzgün çalışmıyor
    Çünkü squash edilmiş commit'in SHA'sı, orijinal dalın HEAD'iyle aynı olmuyor
    Squash edilmiş dalları güvenle tespit edebilen bir araç var mı merak ediyorum

    • Ben yakın zamanda script'i, “son 30 günde commit yok” + “uzakta dal yok” şartıyla silecek şekilde değiştirdim
      Kusursuz değil ama yeterince pratik; silmeden önce her zaman onay istemi gösteriyor
      GitHub'ın otomatik dal silme ayarına baktım
    • Yalnızca squash merge değil, rebase merge de tespit edilmiyor
      Çoğu kişi bunu uzaktaki dal silme olayına hook bağlayarak çözüyor
    • Ben sadece uzak dal kaybolduğunda yerel dalı siliyorum
      git gone adlı bir alias kullanıp git fetch -p sonrası [gone] durumundaki dalları temizliyorum
    • Ben Gerrit kullanılan bir ortamdayım; sunucu tarafında rebase yapılıyor
      Bu yüzden git branch --merged, git cherry, git log grep yöntemlerini birleştiren bir script kullanıyorum
      Ancak commit amend edildiyse ya da birden fazla commit varsa yanlış pozitif çıkabiliyor
    • Önce dalı rebase etmeyi denersen boş dalı tespit etmek mümkün olabilir gibi geliyor
  • Ben birleşmiş dalları temizlemek için git lint adlı bir alias kullanıyorum
    main, master, stable dallarını hariç tutup siliyor; sık sık git pull --prune && git lint kombinasyonunu kullanıyorum

  • Git komutunun kendisi sıradan ama tıklarken Wikileaks kaynaklı bir belgeye denk gelmek ilginçti
    CIA'in “Fine Dining” projesi, USB'ye gizlenmiş zararlı yazılımı uygulama gibi kamufle eden bir araçtı

    • Bu daha çok sıradan bir casusluk tekniği gibi. Asıl 'çılgın' olan, MKULTRA'da insanlara habersizce LSD verilen deneylerdi
  • Asıl sorun aslında sadece birleşmemiş dal listesini yazdırmakla da çözülebilirdi

  • Bu kadar doğal bir iş akışının birkaç satır bash gerektirmesi garip
    Git'in kod tabanı bu kadar büyükken bunun yerleşik özellik olarak gelmemesi üzücü
    İlgili blog yazısına da bakılabilir

    • Ama xargs ya da basit bir for döngüsünü biraz öğrenince bu tür şeyler çok küçük kalıyor
      Bunu yerleşik komut yapmak ise çeşitli istisna durumlarını ele almak zorunda olduğu için daha da karmaşık hale gelebilir
    • Bunu “kod satırı sayısı” ile değerlendirmek bana tuhaf bir ölçüt gibi geliyor
  • Sonunda “galiba xargs'ı yeni öğrenmiş biri” tepkisi de geldi

    • Bu tavır gatekeeping gibi hissettiriyor. Yeni öğrenilen bir şeyi paylaşmak iyi bir şey
      Ben de zamanında bunları bloglardan ve yazılardan öğrendim
    • Ama bunu CIA belgesinden öğrenmiş olmak biraz kuşağın ruhunu yansıtıyor. Artık okuldan çok internetten öğrenilen bir dönemdeyiz
    • Olumsuz tepkiler vardı ama bu tür yardımcı araç kombinasyonları zaten CLI'nin keyifli tarafı
    • Kaynağı CIA olsun ya da olmasın, biri xargs'ı yeni öğrendiyse bu başlı başına güzel bir şey
    • Bell Labs kuşağı için bu içerik fazla temel görünebilir
  • Bu aralar TUI bağımlısı oldum. Bir şey rahatsız ederse Claude-code'dan bana bir TUI yapmasını istiyorum
    Textual kütüphanesini kullanarak Git worktree yönetimi için bir TUI yaptım; Claude Python kodunda epey iyi

    • tig adlı eski bir Git TUI da tavsiye edildi. İlham almak için de iyi
    • Claude'un yazdığı kodun Git deposunu bozabileceği yönünde endişe de dile getirildi
    • TUI'nin ne olduğunu bilmeyenler de vardı
    • Git için TUI aranıyorsa Magit'i güçlü şekilde tavsiye ederim. Öğrenmeye de yardımcı oluyor
      Magit'in rebase özelliğiyle ilgili yazı da faydalı olabilir
    • Benim de Claude ile yaptığım küçük araçlar var. Acaba bunları açık kaynak olarak yayımladın mı diye merak ediyorum
  • Ben de Fish shell'de benzer bir şey yaptım
    fzf ile uzakta kaybolmuş dalları seçip silen bir fonksiyon
    Dotfiles kodum burada