- 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
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
Di komentar HN ada seseorang yang bilang dia memakai program yang saya buat.
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 -DSaya tidak memakai git murni, tetapi saya membersihkannya menggunakan alat bernama gh-poi.
https://github.com/seachicken/gh-poi
Pendapat Hacker News
Saya memakai alias
git tidyuntuk merapikan branchbranch 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
init.defaultBranchitu berisiko. Nama branch default bisa berbeda di tiap repositori, dan pengaturan ini bersifat global sehingga harus ditentukan lebih duluSaya membuat alias
git defaultagar bisa otomatis mencari branch default yang sebenarnya dari remote(origin)Saya memakai perintah cleanup yang terintegrasi dengan
fzfbranch 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.primaryBranchuntuk menentukan branch default yang berbeda per repositoriinit.defaultBranchsebagai gantinya juga tidak masalah. Bahkan untuk repositori yang sudah diinisialisasi, ini tetap bisa bekerja dengangit config --local init.defaultBranch maingit pull origin main:mainlalu lanjut dengangit rebase maingit branch --mergedtidak bekerja dengan baik pada repositori yang memakai squash mergekarena SHA commit hasil squash berbeda dari HEAD branch aslinya
Saya penasaran apakah ada alat yang bisa mendeteksi branch hasil squash dengan aman
Tidak sempurna, tapi cukup praktis, dan sebelum menghapus selalu muncul prompt konfirmasi
Saya merujuk ke pengaturan penghapusan branch otomatis GitHub
Kebanyakan orang menanganinya dengan memasang hook pada event penghapusan branch remote
Saya memakai alias
git goneuntuk menjalankangit fetch -plalu merapikan branch dengan status[gone]Karena itu saya memakai skrip yang menggabungkan tiga metode:
git branch --merged,git cherry, dangit log grepNamun, kalau commit pernah di-amend atau ada banyak commit, bisa muncul false positive
Saya merapikan branch yang sudah di-merge dengan alias
git lintbranch main, master, stable dikecualikan dari penghapusan, dan saya sering memakai kombinasi
git pull --prune && git lintPerintah 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
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
xargsatau for loop, hal seperti ini sebenarnya sepeleKalau dijadikan perintah bawaan, justru bisa lebih rumit karena harus menangani banyak edge case
Pada akhirnya ada juga respons seperti “kelihatannya orang ini baru saja belajar xargs”
Saya juga dulu belajar hal-hal seperti ini dari blog atau tulisan orang lain
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
tig, TUI Git lama yang bagus untuk mencari inspirasiTulisan tentang fitur rebase di Magit juga layak dibaca
Saya juga membuat sesuatu yang mirip di Fish shell
Ini fungsi untuk memilih branch yang sudah hilang di remote lewat
fzflalu menghapusnyaAda di kode dotfiles saya