Saya mengikuti proses pengembangan di mana saya membuat cabang lokal baru untuk setiap fitur atau kartu cerita baru. Setelah selesai saya menggabungkan cabang menjadi master dan kemudian mendorong.
Apa yang cenderung terjadi dari waktu ke waktu karena kombinasi kemalasan atau kelupaan, adalah bahwa saya berakhir dengan daftar besar cabang lokal, beberapa di antaranya (seperti paku) mungkin belum digabung.
Saya tahu cara mendaftar semua cabang lokal saya dan saya tahu cara menghapus satu cabang tapi saya bertanya-tanya apakah ada perintah git yang memungkinkan saya untuk menghapus semua cabang lokal saya?
Di bawah ini adalah output dari git branch --merged
perintah.
user@machine:~/projects/application[master]$ git branch --merged
STORY-123-Short-Description
STORY-456-Another-Description
STORY-789-Blah-Blah
* master
Semua upaya untuk menghapus cabang yang terdaftar dengan grep -v \*
(sesuai jawaban di bawah) menghasilkan kesalahan:
error: branch 'STORY-123-Short-Description' not found.
error: branch 'STORY-456-Another-Description' not found.
error: branch 'STORY-789-Blah-Blah' not found.
Saya menggunakan:
git 1.7.4.1
ubuntu 10.04
GNU bash, versi 4.1.5 (1) -release
GNU grep 2.5.4
Jawaban:
Sub-perintah 'git branch -d' dapat menghapus lebih dari satu cabang. Jadi, sederhanakan jawaban @ sblom tetapi tambahkan xargs kritis:
atau, selanjutnya disederhanakan untuk:
Yang penting, seperti dicatat oleh @AndrewC, menggunakan
git branch
untuk skrip tidak disarankan. Untuk menghindarinya gunakan sesuatu seperti:Perhatian dijamin pada penghapusan!
sumber
error:branch 'STORY-123-Short-Description' not found.
untuk masing-masing cabang yang terdaftar.error:branch 'STORY-123-Short-Description' not found.
kesalahan, ini mungkin karena pengaturan warna git. Ini bekerja untuk saya (perhatikan--no-color
opsi):git branch --no-color --merged | grep -v \* | xargs git branch -D
Saya menemukan cara yang lebih baik dalam mengomentari masalah ini di github :
git branch --merged master --no-color | grep -v master | grep -v stable | xargs git branch -d
sunting: menambahkan opsi tanpa warna dan mengecualikan cabang stabil (tambahkan cabang lain sesuai kebutuhan dalam kasus Anda)
sumber
error: branch 'my-branch-name' not found.
untuk setiap cabang. Menggunakan git versi 1.8.3.4 (Apple Git-47). Ada yang tahu kenapa?git for-each-ref --format '%(refname:short)' refs/heads/ | grep -v master | xargs git branch -d
Parsing output
git branch
tidak direkomendasikan, dan bukan jawaban yang baik untuk pembaca masa depan di Stack Overflow.git branch
adalah apa yang dikenal sebagai perintah porselen. Perintah porselen tidak dirancang untuk diurai mesin dan output dapat berubah di antara berbagai versi Git.git branch
dengan cara yang membuatnya sulit untuk diurai (misalnya, pewarnaan). Jika pengguna telah menetapkancolor.branch
maka Anda akan mendapatkan kode kontrol di output, ini akan mengarah keerror: branch 'foo' not found.
jika Anda mencoba untuk memipakannya ke perintah lain. Anda dapat mem-bypass ini dengan--no-color
flaggit branch
, tetapi siapa yang tahu apa konfigurasi pengguna lain yang mungkin merusak barang.git branch
dapat melakukan hal-hal lain yang mengganggu untuk diuraikan, seperti meletakkan tanda bintang di sebelah cabang yang saat ini diperiksaThe pemelihara git telah mengatakan tentang scripting sekitar
git branch
keluaranJawaban yang menyarankan pengeditan file secara manual di
.git
direktori (seperti .git / refs / head) sama-sama bermasalah (sebagai gantinya mungkin terdapat dalam .git / packed-refs, atau Git dapat mengubah tata letak internal mereka di masa mendatang).Git menyediakan
for-each-ref
perintah untuk mengambil daftar cabang.Git 2.7.X akan memperkenalkan
--merged
opsi sehingga Anda bisa melakukan sesuatu seperti di bawah ini untuk menemukan dan menghapus semua cabang yang digabungkanHEAD
Git 2.6.X dan yang lebih lama, Anda harus mendaftar semua cabang lokal dan kemudian mengujinya secara terpisah untuk melihat apakah mereka telah digabung (yang akan secara signifikan lebih lambat dan sedikit lebih rumit).
sumber
git branch --no-color 2>/dev/null
?git branch
perintah porselen, dan tidak ada jaminan bahwa output tidak akan berubah di beberapa versi git yang akan datang.Cara yang lebih sederhana untuk menghapus semua cabang tetapi menjaga yang lain seperti "mengembangkan" dan "master" adalah sebagai berikut:
sangat berguna !
sumber
Untuk menghapus setiap cabang kecuali cabang yang saat ini Anda periksa:
Saya akan merekomendasikan perubahan
git branch -D $b
keecho $b
beberapa kali pertama untuk memastikan bahwa itu menghapus cabang yang Anda inginkan.sumber
error:branch 'a_branch_name' not found.
saya bisa melihat apa yang Anda coba lakukan dan saya sudah bermain-main dengan perintah itu tetapi untuk beberapa alasan git sepertinya tidak suka nama cabang yang disediakan ...git branch --merged
STORY-123-Short-Description
git branch --merged
, Anda mendapatkan daftar dengan salah satu dari mereka di setiap baris?error:branch 'a_branch_name' not found.
? Atau apakah ia mengeluh tentang salah satu nama cabang darigit branch
output Anda di atas?Perintah di bawah ini akan menghapus semua cabang lokal kecuali cabang master.
Perintah di atas
sumber
git branch | grep -v "master" | xargs git branch -d
dulu jadi saya tidak menghapus cabang yang tidak dihapus, hanya untuk aman. Tapi jawaban yang bagus!,@(git branch | Select-String -Pattern "[^(*?)\s? master]") | ForEach-Object{$_.Line.Trim()} | %{git branch -D $_}
Sekedar catatan, saya akan meningkatkan ke git 1.7.10. Anda mungkin mendapatkan jawaban di sini yang tidak akan berfungsi pada versi Anda. Dugaan saya adalah bahwa Anda harus mengawali nama cabang dengan
refs/heads/
.PERHATIAN, lanjutkan dengan yang berikut ini hanya jika Anda membuat salinan folder kerja dan direktori .git Anda.
Saya terkadang hanya melanjutkan dan menghapus cabang yang tidak saya inginkan langsung
.git/refs/heads
. Semua cabang ini adalah file teks yang berisi 40 karakter sha-1 dari komit yang mereka tuju. Anda akan memiliki informasi asing di Anda.git/config
jika Anda memiliki pelacakan khusus yang diatur untuk salah satu dari mereka. Anda dapat menghapus entri-entri itu secara manual juga.sumber
Coba perintah shell berikut:
Penjelasan:
git branch | grep -v "master"
perintahxargs
perintahxargs git branch -D
sumber
Untuk menghapus semua cabang lokal di linux kecuali yang Anda aktifkan
sumber
Saya merasa lebih mudah menggunakan editor teks dan shell.
git checkout <TAB>
shell. Akan menampilkan semua cabang lokal.git branch -D <PASTE THE BRANCHES NAMES HERE>
.Itu dia.
sumber
Saya memiliki situasi yang serupa dan baru-baru ini menemukan perintah berikut berguna.
Jika Anda ingin menyimpan beberapa cabang, maka
Semoga ini bisa membantu seseorang.
sumber
git branch -D `git branch | awk '{ if ($0 !~ /master/) printf "%s", $0 }'`
Sebenarnya saya pikir Anda memang memilikinya tetapi mereka tersesat dalam format SO.Dari Windows Command Line, hapus semua kecuali cabang yang diperiksa saat ini menggunakan:
sumber
Jika Anda tidak perlu melalui Git itu sendiri, Anda juga dapat menghapus head di bawah .git / refs / head secara manual atau terprogram. Berikut ini akan berfungsi dengan mengutak-atik minimal di bawah Bash:
Ini akan menghapus setiap cabang lokal kecuali cabang master Anda. Karena cabang hulu Anda disimpan di .git / ref / remote , mereka akan tetap tidak tersentuh.
Jika Anda tidak menggunakan Bash, atau ingin mengulang banyak repositori Git sekaligus, Anda dapat melakukan sesuatu yang mirip dengan GNU find:
Solusi find mungkin lebih portabel, tetapi jalur pemangkasan dan nama file rumit dan berpotensi lebih rentan kesalahan.
sumber
Tidak ada jawaban yang memuaskan kebutuhan saya sepenuhnya, jadi inilah dia:
Ini akan menghapus semua cabang lokal yang digabungkan dan dimulai dengan
feature/
,bugfix/
atauhotfix/
. Setelah itu hulu remoteorigin
dipangkas (Anda mungkin harus memasukkan kata sandi).Bekerja pada Git 1.9.5.
sumber
Berdasarkan kombinasi sejumlah jawaban di sini - jika Anda ingin menjaga semua cabang yang ada pada jarak jauh tetapi menghapus sisanya , oneliner berikut akan melakukan trik:
sumber
Meskipun ini bukan solusi baris perintah, saya terkejut bahwa Git GUI belum disarankan.
Saya menggunakan baris perintah 99% dari waktu, tetapi dalam hal ini yang baik untuk memperlambat (maka pertanyaan aslinya), atau Anda tidak tahu apa yang akan Anda hapus ketika beralih ke beberapa manipulasi shell panjang, tapi pintar.
UI memecahkan masalah ini karena Anda dapat dengan cepat memeriksa cabang yang ingin Anda hapus, dan diingatkan pada yang ingin Anda pertahankan, tanpa harus mengetikkan perintah untuk setiap cabang.
Dari UI, buka Cabang -> Hapus dan Ctrl + Klik cabang yang ingin Anda hapus sehingga disorot. Jika Anda ingin memastikan mereka digabung menjadi cabang (seperti
dev
), di bawah Hapus Hanya jika Digabungkan Ke setel Cabang Lokal kedev
. Kalau tidak, atur ke Selalu untuk mengabaikan pemeriksaan ini.sumber
Untuk PowerShell, ini akan berhasil:
sumber
Script berikut menghapus cabang. Gunakan dan modifikasi dengan risiko Anda sendiri, dll. Dll
Berdasarkan jawaban lain dalam pertanyaan ini, saya akhirnya menulis skrip bash cepat untuk saya sendiri. Saya menyebutnya "gitbd" (cabang git -D) tetapi jika Anda menggunakannya, Anda dapat mengubah nama itu menjadi apa pun yang Anda inginkan.
Ini akan menawarkan untuk menghapus cabang apa pun yang cocok dengan argumen pola, jika diteruskan, atau semua cabang lokal saat dipanggil tanpa argumen. Ini juga akan memberi Anda langkah konfirmasi, karena, Anda tahu, kami menghapus banyak hal, jadi itu bagus.
Agak bodoh - jika tidak ada cabang yang cocok dengan polanya, itu tidak menyadarinya.
Contoh output run:
sumber
Saya menulis skrip shell untuk menghapus semua cabang lokal kecuali
develop
sumber
Jawaban di atas berfungsi dengan baik. Berikut adalah pendekatan lain ketika kami memiliki banyak cabang di repo lokal dan kami harus menghapus banyak cabang kecuali beberapa yang terletak di mesin lokal.
Pertama
git branch
akan mendaftar semua cabang lokal.Untuk memindahkan kolom nama cabang menjadi satu baris dalam file dengan menjalankan perintah unix
git branch > sample.txt
Ini akan menyimpannya dalam file sample.txt . Dan jalankan
awk 'BEGIN { ORS = " " } { print }' sample.txt
perintah di shell. Ini akan mengubah kolom menjadi baris dan menyalin daftar nama cabang dalam satu baris.
Dan kemudian jalankan
git branch -D branch_name(s)
.Ini akan menghapus semua cabang terdaftar yang ada di lokal
sumber
Cara yang paling pragmatis: pastikan Anda tidak memiliki pekerjaan yang belum dikomit
master
, komit / dorong jika perlu, klon salinan repositori baru, dan hapus yang lama.sumber
Untuk tujuan ini, Anda dapat menggunakan git-ekstra
sumber
Saya tidak punya grep atau unix lain di komputer saya, tetapi ini berfungsi dari terminal VSCode:
git branch -d $(git branch).trim()
Saya menggunakan huruf kecil d sehingga tidak akan menghapus cabang yang tidak dihapus.
Saya juga menjadi master ketika saya melakukannya, jadi
* master
tidak ada sehingga tidak berusaha menghapus master.sumber
master
, perintah ini AKAN dihapusmaster
.Pastikan Anda melakukan ini dulu
Setelah Anda memiliki semua informasi cabang jarak jauh, gunakan perintah berikut untuk menghapus setiap cabang tunggal kecuali master
sumber