26 poin oleh GN⁺ 2026-02-21 | 4 komentar | Bagikan ke WhatsApp
  • Sebuah perintah sederhana untuk mengatasi masalah merapikan branch Git lama ditemukan dalam dokumen pengembangan internal CIA
    git branch --merged | grep -v "\*\|master" | xargs -n 1 git branch -d
  • Perintah ini menghapus branch yang sudah di-merge secara massal dari hasil git branch --merged, dengan mengecualikan branch saat ini dan master
  • Ada juga versi yang diperbarui agar sesuai dengan proyek modern dengan mengecualikan branch main dan develop
  • Bisa didaftarkan sebagai alias Git untuk mengotomatisasi pekerjaan berulang, dan menjadi alat yang sederhana namun berguna untuk meningkatkan efisiensi kerja secara konsisten serta merapikan repositori

Tip Git yang ditemukan di Vault7

  • Dokumen Vault7 yang dipublikasikan WikiLeaks pada 2017 berisi alat peretasan CIA dan dokumen pengembangan internal
    • Di salah satu halamannya ada kumpulan tip dan trik Git, yang sebagian besar berisi cara umum untuk memperbaiki commit, menggunakan stash, bisect, dan sebagainya
  • Salah satu perintah satu baris yang ditemukan di dokumen itu masih tetap saya simpan di ~/.zshrc hingga sekarang

Masalah branch lama yang menumpuk

  • Di repositori Git lokal, seiring waktu branch yang sudah di-merge akan terus menumpuk dan jadi sulit dirapikan
    • Branch fitur, hotfix, maupun branch eksperimen tetap tersisa setelah di-merge sehingga daftar git branch menjadi berantakan
  • Perintah git branch --merged bisa digunakan untuk melihat branch yang sudah di-merge, tetapi menghapusnya secara manual itu merepotkan

Perintah asli dari dokumen CIA

  • Perintah asli yang ditampilkan adalah sebagai berikut
    git branch --merged | grep -v "\*\|master" | xargs -n 1 git branch -d  
    
  • Penjelasan komponennya
    • git branch --merged: menampilkan daftar semua branch lokal yang sudah di-merge ke branch saat ini
    • grep -v "\*\|master": mengecualikan branch saat ini (*) dan master
    • xargs -n 1 git branch -d: menghapus branch sisanya satu per satu dengan aman (-d tidak akan menghapus branch yang belum di-merge)

Versi perintah yang dimodernisasi

  • Karena sebagian besar proyek menggunakan branch main, perintahnya bisa diubah seperti berikut
    git branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d  
    
  • Jika dijalankan di branch main setelah deployment, puluhan branch bisa berkurang menjadi hanya beberapa
  • Perintah ini juga bisa didaftarkan sebagai alias Git agar lebih mudah dijalankan
    alias ciaclean='git branch --merged origin/main | grep -vE "^\s*(\*|main|develop)" | xargs -n 1 git branch -d'  
    
    • Setelah itu, cukup ketik perintah ciaclean di repositori untuk menjalankan pembersihan otomatis

Efisiensi dan kepraktisan

  • Perintah ini membantu menghemat beberapa menit setiap minggu dan menjaga daftar branch tetap rapi
  • Meski sederhana, alat ini dinilai praktis karena memberi peningkatan produktivitas yang konsisten

4 komentar

 
foriequal0 2026-02-21

Di komentar HN ada seseorang yang bilang dia memakai program yang saya buat.

Saya memakai git-trim untuk itu:
https://github.com/foriequal0/git-trim
README juga menjelaskan kenapa ini lebih baik daripada oneliner bash dalam beberapa kasus.
https://news.ycombinator.com/item?id=47089533

 
youngminz 2026-02-21

Saya juga memakai alias bernama git gone. Sangat praktis - 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

Saya tidak memakai git murni, tetapi saya membersihkannya menggunakan alat bernama gh-poi.

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

 
GN⁺ 2026-02-21
Pendapat Hacker News
  • Saya memakai alias git tidy untuk merapikan branch
    branch default (main, master) tidak dihapus, dan branch saat ini maupun branch di worktree lain juga tidak disentuh
    branch yang sudah hilang di remote juga otomatis dihapus, dan kodenya ada di pengaturan dotfiles saya

    • Menggunakan init.defaultBranch itu berisiko. Nama branch default bisa berbeda di tiap repositori, dan pengaturan ini bersifat global sehingga harus ditentukan lebih dulu
      Saya membuat alias git default agar bisa otomatis mencari branch default yang sebenarnya dari remote(origin)
    • Skrip ini sangat berguna, jadi akan bagus kalau dikontribusikan ke git extras
  • Saya memakai perintah cleanup yang terintegrasi dengan fzf
    branch yang sudah di-merge bisa dipilih lebih dulu lalu dihapus sekaligus, dan kalau mau beberapa bisa dikecualikan
    branch remote juga ikut dirapikan, dan kodenya ada di pengaturan .gitconfig saya
    Selain itu saya memakai variabel user.primaryBranch untuk menentukan branch default yang berbeda per repositori

    • Saya rasa memakai init.defaultBranch sebagai gantinya juga tidak masalah. Bahkan untuk repositori yang sudah diinisialisasi, ini tetap bisa bekerja dengan git config --local init.defaultBranch main
    • Kita bisa pull dari branch lain tanpa berpindah branch. Misalnya git pull origin main:main lalu lanjut dengan git rebase main
  • git branch --merged tidak bekerja dengan baik pada repositori yang memakai squash merge
    karena SHA commit hasil squash berbeda dari HEAD branch aslinya
    Saya penasaran apakah ada alat yang bisa mendeteksi branch hasil squash dengan aman

    • Saya baru-baru ini mengubah skrip agar menghapus branch dengan syarat “tidak ada commit dalam 30 hari terakhir” + “tidak ada branch di remote”
      Tidak sempurna, tapi cukup praktis, dan sebelum menghapus selalu muncul prompt konfirmasi
      Saya merujuk ke pengaturan penghapusan branch otomatis GitHub
    • Bukan cuma squash merge, rebase merge juga tidak terdeteksi
      Kebanyakan orang menanganinya dengan memasang hook pada event penghapusan branch remote
    • Saya cukup menghapus branch lokal saat branch remote-nya hilang
      Saya memakai alias git gone untuk menjalankan git fetch -p lalu merapikan branch dengan status [gone]
    • Saya bekerja di lingkungan yang memakai Gerrit, jadi rebase terjadi di server
      Karena itu saya memakai skrip yang menggabungkan tiga metode: git branch --merged, git cherry, dan git log grep
      Namun, kalau commit pernah di-amend atau ada banyak commit, bisa muncul false positive
    • Mungkin kita bisa mendeteksi branch kosong dengan lebih dulu mencoba me-rebase branch tersebut
  • Saya merapikan branch yang sudah di-merge dengan alias git lint
    branch main, master, stable dikecualikan dari penghapusan, dan saya sering memakai kombinasi git pull --prune && git lint

  • Perintah Git-nya sendiri biasa saja, tapi menarik karena saat mengklik saya malah melihat dokumen yang sumbernya dari Wikileaks
    Proyek “Fine Dining” milik CIA adalah alat untuk menyamarkan malware yang tersembunyi di USB agar tampak seperti aplikasi

    • Itu malah terdengar seperti teknik spionase yang umum. Yang benar-benar ‘gila’ itu eksperimen seperti MKULTRA yang diam-diam memberi LSD ke orang
  • Sebenarnya masalah aslinya juga bisa diselesaikan cukup dengan menampilkan daftar branch yang belum di-merge

  • Rasanya aneh bahwa pekerjaan senatural ini membutuhkan beberapa baris bash
    codebase Git sudah sebesar itu, jadi sayang sekali fitur seperti ini tidak tersedia sebagai fungsi bawaan
    Lihat juga artikel blog terkait

    • Tapi kalau sudah sedikit terbiasa dengan xargs atau for loop, hal seperti ini sebenarnya sepele
      Kalau dijadikan perintah bawaan, justru bisa lebih rumit karena harus menangani banyak edge case
    • Menilai hal seperti ini dari “jumlah baris kode” rasanya standar yang aneh
  • Pada akhirnya ada juga respons seperti “kelihatannya orang ini baru saja belajar xargs”

    • Sikap seperti itu terasa seperti gatekeeping. Berbagi hal yang baru dipelajari itu baik
      Saya juga dulu belajar hal-hal seperti ini dari blog atau tulisan orang lain
    • Tapi fakta bahwa ini dipelajari dari dokumen CIA terasa seperti potret sebuah generasi. Zaman sekarang orang belajar dari internet, bukan sekolah
    • Memang ada respons negatif, tapi kombinasi utilitas seperti inilah justru daya tarik CLI
    • Entah sumbernya dari CIA atau apa pun, kalau ada orang yang baru belajar xargs, itu sendiri sudah keren
    • Dari sudut pandang generasi Bell Labs, ini mungkin terasa terlalu dasar
  • Akhir-akhir ini saya kecanduan TUI. Kalau ada yang terasa merepotkan, saya minta Claude-code membuatkan TUI
    Dengan library Textual, saya membuat TUI untuk mengelola Git worktree, dan Claude cukup bagus menangani kode Python

    • Saya juga direkomendasikan tig, TUI Git lama yang bagus untuk mencari inspirasi
    • Ada juga pendapat yang khawatir kode buatan Claude bisa merusak repositori Git
    • Ada orang yang bahkan tidak tahu apa itu TUI
    • Untuk TUI Git, saya sangat merekomendasikan Magit. Ini juga membantu untuk belajar
      Tulisan tentang fitur rebase di Magit juga layak dibaca
    • Saya juga punya banyak alat kecil yang dibuat dengan Claude. Jadi saya penasaran apakah itu pernah dirilis sebagai open source
  • Saya juga membuat sesuatu yang mirip di Fish shell
    Ini fungsi untuk memilih branch yang sudah hilang di remote lewat fzf lalu menghapusnya
    Ada di kode dotfiles saya