Saya memiliki anggota tim yang secara tidak sengaja mendorong lebih dari 150 cabang lokalnya ke repo pusat kami. Untungnya, mereka semua memiliki awalan yang sama. Menggunakan awalan itu, apakah ada perintah git atau skrip shell kecil yang keren yang dapat saya gunakan yang akan menghapus semuanya sekaligus?
129
$ git branch -r | awk -F/ '/\/APR/{print $2}' | xargs -I {} git push origin :{} error: unable to push to unqualified destination: APR-04-DPH The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to 'GIT_URL'
git branch -r | awk -F/ '/\/APR/{print $2}'
, dapatkah Anda melihat semua nama cabang berawalan APR terdaftar?APR-04-DPH
cabangnya sudah dihapus. Lihatlah pertanyaan-pertanyaan yang telah dijawab ini : ini dan ini dan juga ini . Jawaban atas pertanyaan tersebut mengatasi masalah yang sama, Anda mungkin ingin menguji sendiri solusinya.git branch -r | awk -F/ '/\/PREFIX/{print $2"/"$3}' | xargs -I % git push origin --delete %
Jika Anda menyukai pendekatan yang lebih sederhana, misalnya hapus 3 atau 4 cabang:
Penting: Hanya berfungsi di Git v1.7.0 dan yang lebih baru.
sumber
git branch -r | awk -F/ '/\/PATTERN/{print $2}' | xargs git push origin --delete
Terima kasih kepada Neevek untuk solusi yang hebat dan elegan!
Tetapi saya mengalami masalah dengan garis miring pada nama cabang (saya menggunakan Git Flow), karena
awk
pemisah bidang/
(-F
opsi)Jadi solusi saya didasarkan pada Neevek , tetapi dengan benar mem-parsing nama cabang
/
. Dalam hal ini saya menganggap remote Anda dipanggilorigin
. Perintah untuk menghapus cabang jarak jauh dengan nama yang dilihat denganPATTERN
:Dan jangan lupa untuk memeriksa apa yang akan Anda hapus:
TIPS BERGUNA: Jika nama cabang Anda (tanpa
origin/
awalan) disimpan dalam file teks (satu nama cabang per baris), jalankan saja:sumber
xargs -a file -L
sebagai ganticat file | xargs
. Bahkan lebih sederhanaxargs -a file git push --delete origin
.Ini mungkin jawaban duplikat tetapi di bawah diuji dan bekerja untuk saya dengan sempurna.
git branch -D backticks $ (git branch --list 'feature / *' backticks )
sumber
Sama dengan grep:
git branch -r | grep -Eo 'PREFIX/.*' | xargs -i git push origin :{}
.branch -r
acaraorigin/prefix/branchname
. Jadi itu akan memakan waktuprefix/branchname
.sumber
xargs -I {} git push origin :{}
, bukan-i
.-i
itu menggunakan pengganti default{}
tetapi dengan-I
Anda dapat mendeklarasikannya sendiri. ... baru saja ditemukan di manual:-i ... the same as -I{}
Solusi Neevek elegan, tetapi bisa lebih baik: solusi seperti yang diusulkan panggilan 'git push' sekali per cabang, yang berarti jaringan tambahan perjalanan pulang pergi per cabang akan dihapus. Karena Anda tetap menggunakan awk, mengapa tidak menggunakannya untuk mengawali ':' dan kemudian xargs dapat memanggil 'git push' tepat sekali dan menghapus semua cabang sekaligus:
Jalankan uji coba untuk membuat daftar cabang yang akan dihapus:
Solusi terakhir untuk benar-benar mendorong penghapusan:
sumber
xargs: replstr may not be empty
dengan Neevek, mungkin versi git ..git version 1.9.5
Tapi ini bekerja dengan baik untuk saya. Terima kasih untuk Anda berduasumber daya https://coderwall.com/p/eis0ba
sumber
Terima kasih kepada Steve dan Neevek, saya menemukan solusi yang bekerja cukup baik untuk saya yang menurut saya layak untuk dibagikan:
Solusi Steve berhasil untuk saya dengan satu penyesuaian kecil. Remote saya diberi nama
origin/feature/some-feature-name
jadi saya memangkasawk
:Sekarang melakukan aliran penghapusan kecil yang bagus:
Saya bertanya-tanya apakah ada yang punya ide untuk solusi yang lebih elegan, yang mungkin menghasilkan sesuatu seperti ini (skrip CLI saya sangat buruk, jadi saya butuh waktu untuk memikirkannya):
Ini akan menghasilkan satu keluaran yang bagus dengan satu permintaan jaringan:
sumber
Terima kasih untuk Neevek. Ini bekerja dengan baik setelah mengkonfigurasi ulang untuk tujuan saya:
Saya juga perlu mempertimbangkan struktur folder. Cabang fitur saya berada dalam struktur folder seperti origin / feature / PREFIX-FEATURENUMBER. Jadi saya harus membangun pola saya dari $ 2 = folder + $ 3 = branchname.
sumber
Semua orang menggunakan
awk
, tidak yakin mengapa. Saya merasa itu lebih kompleks. Inilah yang saya gunakan untuk menghapus semua cabang jarak jauh difork
remote saya :Lempar di
grep
antaraxargs
dansed
jika Anda perlu memfilter daftar ke hanya subset cabang jauh.sumber
origin/blaprefix_anotherbla
. Tapi menggunakansed
menanganinya dengan baik. Keuntungan lain dari pendekatan ini, adalah saya menggunakan bitbucket dan saya tidak perlu memasukkan kata sandi otentikasi untuk setiap penghapusan cabang secara manual. Yang ini menghapus semua cabang dalam satu batch.git branch -r | egrep 'origin/greenkeeper' | sed 's/origin\///' | xargs -I {} git push origin --delete {}
Saya menyadari ini untuk perintah git, tetapi jika Anda mencari solusi alternatif untuk melakukan hasil yang serupa atau sama:
Anda dapat melakukannya dari sini (Git Remove Remote Branches):
Kemudian pilih cabang yang Anda inginkan:
Pastikan Anda memiliki izin untuk menghapus cabang jarak jauh.
sumber
Github juga memiliki UI dan mekanisme yang bagus untuk menghapus cabang dengan cepat, itu jika Anda lebih suka menggunakan UI
sumber
Saya mencoba menghapus semua cabang jarak jauh asal / rilis / r1-1 *, karenanya baris perintah berikut berfungsi dengan baik.
sumber
Saya tidak dapat menggunakan awk karena kami menggunakan struktur garis miring untuk nama cabang kami.
Ini mendapatkan semua cabang jarak jauh, dapatkan hanya satu untuk satu pengguna, jarak jauh string "origin /" dan jalankan penghapusan pada masing-masing.
sumber
Uji coba kering:
Hapus cabang jarak jauh:
Hapus hanya cabang jarak jauh yang digabungkan sepenuhnya:
Penjelasan:
sed "s/origin\///"
akan dihapusorigin/
dari nama cabang. Tanpa melepaskannya saya mendapat:remote ref does not exist
sumber
Jawaban sebelumnya membantu saya untuk menghapus semua cabang rilis dari 2018. Saya menjalankan ini di command prompt windows 10 saya. Saya telah menginstal clink , jadi Linux seperti perintah bekerja untuk saya.
Jalankan Kering:
Jika dry run menunjukkan cabang yang tidak di remote / origin. Jalankan di bawah perintah git prune untuk memperbaiki dan memeriksa lagi.
Hapus setelah Anda puas dengan hasil di atas:
Jika Anda melihat:
error: unable to delete 'release-...2018': remote ref does not exist
. Kemudian jalankan perintah prune sebelumnya dan coba lagi.sumber
Peringatan: Ini akan menghapus semua cabang jarak jauh. Gunakan dengan hati-hati.
Saya pikir cara saya menghapus cabang jarak jauh adalah yang terbaik.
Peringatan: Ini akan menghapus semua cabang jarak jauh. Gunakan dengan hati-hati.
sumber