Saya ingin membersihkan repositori lokal saya, yang memiliki satu ton cabang tua: misalnya 3.2
, 3.2.1
, 3.2.2
, dll
Saya berharap cara licik untuk menghapus banyak dari mereka sekaligus. Karena mereka kebanyakan mengikuti konvensi dot release, saya pikir mungkin ada jalan pintas untuk mengatakan:
git branch -D 3.2.*
dan bunuh semua cabang 3.2.x.
Saya mencoba perintah itu dan itu, tentu saja, tidak berhasil.
git branch -D $(git branch | grep 3.2*)
- ini bekerja untuk saya. Ini menghapus cabang yang namanya dimulai dengan "3.2".grep
- pencocokan pola dalam output (git branch
dalam hal ini).$()
- Berarti mengeksekusi dan menempatkan hasilnya.|
- rantai.-D
adalah penghapusan kekuatan , harus digunakan-d
dalam banyak kasus untuk lebih aman terlebih dahulu.Jawaban:
Tidak dengan sintaks itu. Tetapi Anda dapat melakukannya seperti ini:
Pada dasarnya, cabang git akan menghapus banyak cabang untuk Anda dengan satu permintaan. Sayangnya itu tidak menyelesaikan nama cabang. Meskipun, dalam bash, Anda dapat melakukan:
sumber
git branch -D/-d
bekerja dengan baik untuk saya. Mungkin ingin memperbarui milik Anda (mungkin dari direktori contrib git.git terbaru).git branch | ...
Anda bisa menggunakan$(git for-each-ref --format='%(refname:short)' refs/heads/3.*)
. Ini lebih lama, saya tahu, tetapi dijamin menjadi output yang sesuai, sementaragit branch
memiliki output yang cukup dengan hal-hal seperti*
dan->
(untuk symrefs) yang dapat mengacaukan Anda dalam skrip / one-liners.grep
selalu menyertakan bendera--color=always
-git branch -D
melemparkanerror: branch 'my_branch' not found.
sampai saya berlari tanpa bendera warna.git branch --merged ${1-$(current_branch)} | grep -v ${1-$(current_branch)} | xargs git branch -d
git branch -D 3.2{,.1,.2}
untuk menghapus ketiga cabang gnu.org/software/bash/manual/html_node/Brace-Expansion.htmlNah, dalam kasus terburuk, Anda bisa menggunakan:
sumber
| xargs git branch -d
bagian untuk memeriksa apa yang sebenarnya akan dihapus.grep
outputgit branch
, seperti yang dimaksudkan untuk membaca, bukan penguraian. Bisa berubah sewaktu-waktu. gunakanfor-each-ref
bersama - sama dengan--format
params, seperti yang disarankan dalam jawaban lain, dan kemudian gabungkan dengan saran dalam jawaban ini.EDIT:
Versi yang lebih aman (disarankan oleh Jakub Narębski dan Jefromi), karena keluaran git branch tidak dimaksudkan untuk digunakan dalam skrip:
... atau xargs-free:
sumber
git branch
output untuk skrip. Gunakangit for-each-ref
.git for-each-ref --format="%(refname:short)" refs/tags/\*@\* | xargs git tag -d
If one or more patterns are given, only refs are shown that match against at least one pattern, either using fnmatch(3) or literally, in the latter case matching completely or from the beginning up to a slash
-D
adalah penghapusan kekuatan , harus digunakan-d
dalam banyak kasus untuk lebih aman terlebih dahulu.Anda dapat menggunakan cabang git - daftar untuk mendaftar cabang yang memenuhi syarat, dan menggunakan cabang git -D / -d untuk menghapus cabang yang memenuhi syarat.
Contoh satu liner:
sumber
error: branch 'package.json' not found.
. Tampaknya * diperluas terlalu dini, dan mencoba untuk menghapus cabang yang sesuai dengan nama setiap file dan direktori.gitconfig
meskipun ...git branch --list '3.2.*'
git branch -d (git branch --list '3.2.*').trim()
Baru-baru ini, saya mencari solusi untuk masalah yang sama, akhirnya saya menemukan satu jawaban dan itu bekerja dengan sangat baik:
Solusi ini luar biasa dan jika Anda ingin penjelasan lengkap dari setiap perintah dan cara kerjanya, diberikan di sini .
sumber
Menggunakan
sumber
alias grefs='git for-each-ref --format="%(refname:short)"'
jadi saya bisa melakukannyagrefs | grep 'regexpattern' | xargs git branch -D
Mungkin Anda akan menemukan ini berguna:
Jika Anda ingin menghapus semua cabang yang bukan misalnya 'master', 'foo' dan 'bar'
grep -v 'something' adalah korek api dengan inversi.
sumber
-D
opsi dibandingkan dengan jawaban lain. Terima kasih atas jawabannya di sini @Adi. Solusi bekerja untuk saya.Saya menempatkan inisial dan tanda hubung saya (at-) sebagai tiga karakter pertama dari nama cabang untuk alasan yang tepat ini:
sumber
Jika Anda tidak dibatasi untuk menggunakan prompt perintah git, maka Anda selalu dapat menjalankan
git gui
dan menggunakan item menu Branch-> Delete. Pilih semua cabang yang ingin Anda hapus dan biarkan rip.sumber
Solusi Powershell:
Jika Anda menjalankan windows, Anda dapat menggunakan PowerShell untuk menghapus beberapa cabang sekaligus ...
Anda juga dapat menyesuaikan bagaimana pencocokan pola harus bekerja menggunakan perintah Select-String Powershell. Lihatlah dokumen PowerShell .
sumber
Terus "kembangkan" dan hapus semua yang lain di lokal
sumber
Saya membuat fungsi kecil yang mungkin berguna berdasarkan jawaban yang diberikan oleh @gawi (di atas).
Tambahkan itu ke Anda
.bash_profile
dan mulai ulang terminal Anda. Maka Anda dapat menelepon dari command-line seperti ini:Catatan
Saat ini saya sudah menyiapkan untuk penghapusan lunak, yang berarti tidak akan menghapus cabang kecuali mereka sudah bergabung. Jika Anda suka hidup di tepi, ubah
-d
ke-D
dan itu akan menghapus semuanya dengan awalan!sumber
Jika Anda benar-benar perlu membersihkan semua cabang Anda, cobalah
git branch -d $(git branch)
Ini akan menghapus semua cabang gabungan lokal Anda kecuali cabang yang sedang Anda periksa.
Ini cara yang baik untuk membuat kebersihan lokal Anda
sumber
Anda mungkin menyukai item kecil ini ... Ini menarik daftar dan meminta konfirmasi untuk setiap item sebelum akhirnya menghapus semua pilihan ...
Gunakan -D untuk memaksa penghapusan (seperti biasa).
Agar mudah dibaca, berikut ini adalah garis putus-putus ...
di sini adalah pendekatan xargs ...
akhirnya, saya suka memiliki ini di .bashrc saya
Dengan begitu aku bisa bilang begitu
sumber
Untuk jiwa murni yang menggunakan PowerShell di sini skrip kecil
git branch -d $(git branch --list '3.2.*' | %{$_.Trim() })
sumber
itu berfungsi dengan baik untuk saya:
hapus semua cabang lokal
sumber
Gunakan perintah berikut untuk menghapus semua cabang (cabang yang dicentang tidak akan dihapus).
Sunting: Saya menggunakan Mac Os
sumber
Jika Anda menggunakan windows, Anda dapat menggunakan PowerShell untuk melakukan ini:
ganti
feature/*
dengan pola yang Anda suka.sumber
Anda dapat menggunakan perintah ini:
git branch -D $(printf "%s\n" $(git branch) | grep '3.2')
sumber
Anda dapat menggunakan
git gui
untuk menghapus beberapa cabang sekaligus. Dari Command Prompt / Bash ->git gui
-> Remote -> Hapus cabang ... -> pilih cabang jarak jauh yang ingin Anda hapus -> Hapus.sumber
Saya baru saja membersihkan satu set cabang lokal / terpencil yang sudah usang hari ini.
Di bawah ini adalah bagaimana saya melakukannya:
1. daftar semua nama cabang ke file teks:
git branch -a >> BranchNames.txt
2. tambahkan cabang yang ingin saya hapus ke perintah "git branch -D -r":
cabang git -D -r asal / dirA / branch01 asal / dirB / branch02 asal / dirC / branch03 (... tambahkan nama cabang apa pun)
3. jalankan cmd
Dan yang ini bekerja jauh lebih cepat dan dapat diandalkan daripada " git push origin --delete ".
Ini mungkin bukan cara yang paling cerdas seperti yang tercantum dalam jawaban lain, tetapi yang ini cukup mudah, dan mudah digunakan.
sumber
Jika Anda telah menginstal Git GUI, yang merupakan add-on default untuk Windows, maka itu yang paling sederhana. Anda dapat menggunakan ctrl untuk memilih beberapa cabang dan menghapusnya dengan satu klik.
sumber
Jika Anda menggunakan Kerang Ikan, Anda dapat memanfaatkan
string
fungsinya :Ini tidak jauh berbeda dari opsi Powershell dalam beberapa jawaban lainnya.
sumber
Jika Anda memiliki semua cabang untuk dihapus dalam file teks (branch-to-del.txt) (satu cabang per baris), maka Anda bisa melakukan ini untuk menghapus semua cabang tersebut dari jarak jauh (asal):
xargs -a branches-to-del.txt git push --delete origin
sumber
Untuk menghapus beberapa cabang berdasarkan pola yang ditentukan lakukan hal berikut:
Buka terminal, atau setara dan ketik perintah berikut:
Hapus semua cabang 3.2.x, Anda perlu mengetik
Itu saja!
Kamu baik untuk pergi!
sumber
Seperti dalam Git, semua cabang bukan apa-apa dengan merujuk pada repo git, mengapa Anda tidak menghapus saja cabang yang dituju
.git/ref
dan kemudian jika ada sesuatu yang tidak menarik di repositori akan secara otomatis menjadi sampah yang dikumpulkan sehingga Anda tidak perlu repot.sumber
git branch -D <branchName>
sumber
Anda dapat menghapus semua cabang dengan menghapus semua referensi yang tidak perlu:
rm .git/refs/heads/3.2.*
sumber
git gc
). Jangan lakukan itu.