- 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
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
HN yorumlarında, benim yaptığım programı kullandığını söyleyen biri varmış.
> Bunun için ben
git-trimkullanı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
Ben de
git goneadı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 -DBen saf git kullanmıyorum ama temizleme için
gh-poiadlı aracı kullanıyorum.https://github.com/seachicken/gh-poi
Hacker News görüşleri
Ben dalları temizlemek için
git tidyadlı bir alias kullanıyorumVarsayılan dalı (
main,master) silmiyor; mevcut dalı ya da başka bir worktree'ye ait dalları da kurcalamıyorUzaktan silinmiş dalları da otomatik olarak kaldırıyor; kodu dotfiles ayarlarımda var
init.defaultBranchkullanmak riskli. Her depo için varsayılan dal adı farklı olabilir ve bu ayar global olduğu için önceden belirlenmesi gerekirBen
git defaultadlı bir alias yapıp uzaktaki (origin) gerçek varsayılan dalı otomatik bulduruyorumBen
fzfile entegre bir cleanup komutu kullanıyorumBirleş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.primaryBranchdeğişkeniyle depo bazında farklı varsayılan dallar tanımlıyoruminit.defaultBranchda kullanılabilir diye düşünüyorum. Zaten başlatılmış depolarda bilegit config --local init.defaultBranch mainile çalışıyorgit pull origin main:mainardındangit rebase mainyeterli olurgit 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
Kusursuz değil ama yeterince pratik; silmeden önce her zaman onay istemi gösteriyor
GitHub'ın otomatik dal silme ayarına baktım
Çoğu kişi bunu uzaktaki dal silme olayına hook bağlayarak çözüyor
git goneadlı bir alias kullanıpgit fetch -psonrası[gone]durumundaki dalları temizliyorumBu yüzden
git branch --merged,git cherry,git log grepyöntemlerini birleştiren bir script kullanıyorumAncak commit amend edildiyse ya da birden fazla commit varsa yanlış pozitif çıkabiliyor
Ben birleşmiş dalları temizlemek için
git lintadlı bir alias kullanıyorummain,master,stabledallarını hariç tutup siliyor; sık sıkgit pull --prune && git lintkombinasyonunu kullanıyorumGit 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ı
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
xargsya da basit bir for döngüsünü biraz öğrenince bu tür şeyler çok küçük kalıyorBunu yerleşik komut yapmak ise çeşitli istisna durumlarını ele almak zorunda olduğu için daha da karmaşık hale gelebilir
Sonunda “galiba
xargs'ı yeni öğrenmiş biri” tepkisi de geldiBen de zamanında bunları bloglardan ve yazılardan öğrendim
xargs'ı yeni öğrendiyse bu başlı başına güzel bir şeyBu 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
tigadlı eski bir Git TUI da tavsiye edildi. İlham almak için de iyiMagit'in rebase özelliğiyle ilgili yazı da faydalı olabilir
Ben de Fish shell'de benzer bir şey yaptım
fzfile uzakta kaybolmuş dalları seçip silen bir fonksiyonDotfiles kodum burada