Dengan git remote prune origin
saya dapat menghapus cabang lokal yang tidak lagi di remote.
Tapi saya juga ingin menghapus cabang lokal yang dibuat dari cabang-cabang terpencil itu (cek jika tidak dihapus akan lebih baik).
Bagaimana saya bisa melakukan ini?
npx git-removed-branches
(lari kering) ataunpx git-removed-branches --prune
(nyata). Anda harus sudah menginstal node.js. Lihat jawaban di bawah untuk detailnya.Jawaban:
Setelah pemangkasan, Anda bisa mendapatkan daftar cabang jarak jauh
git branch -r
. Daftar cabang dengan cabang pelacakan jarak jauh mereka dapat diambil dengangit branch -vv
. Jadi, menggunakan kedua daftar ini, Anda dapat menemukan cabang pelacakan jarak jauh yang tidak ada dalam daftar remote.Baris ini harus melakukan trik (mengharuskan
bash
atauzsh
, tidak akan bekerja dengan shell Bourne standar):git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d
String ini mendapatkan daftar cabang jarak jauh dan meneruskannya
egrep
melalui input standar. Dan memfilter cabang yang memiliki cabang pelacakan jarak jauh (menggunakangit branch -vv
dan memfilter untuk yang memilikiorigin
) kemudian mendapatkan kolom pertama dari output yang akan menjadi nama cabang. Akhirnya meneruskan semua nama cabang ke perintah hapus cabang.Karena menggunakan
-d
opsi, itu tidak akan menghapus cabang yang belum digabung ke cabang yang Anda aktifkan saat Anda menjalankan perintah ini.Ingat juga bahwa Anda harus menjalankannya
git fetch --prune
terlebih dahulu , jika tidak,git branch -r
masih akan melihat cabang jarak jauh.sumber
git fetch -p
tidak selalu cukup?sh.exe": cannot make pipe for process substitution: Function not implemented sh.exe": egrep -v -f /dev/fd/0: No such file or directory fatal: branch name required
Ada ide?alias git-remove-untracked='git fetch --prune && git branch -r | awk "{print \$1}" | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk "{print \$1}" | xargs git branch -d'
git branch -D
pada akhir perintah bekerja lebih baik untuk kita, karena kita cenderung menekan komit pada penggabungan, yang membuat kitaThe branch x is not fully merged
kesalahan saat menjalankan-d
.Jika Anda ingin menghapus semua cabang lokal yang sudah digabung menjadi master, Anda dapat menggunakan perintah berikut:
Info lebih lanjut .
sumber
xargs -r git branch -d
agar tidak ada yang berjalan jika tidak ada cabang yang dihapus. Perhatikan bahwa-r
bendera mungkin tidak tersedia di managit branch --merged master --no-color | grep -v '^* master$' | xargs -n1 -r git branch -d
git branch --merged master
daftar cabang yang digabung menjadi master, maka bagian grep tengah mengecualikan master itu sendiri (kami tidak ingin menghapus master!), Dan bagian xargs terakhir dijalankangit branch -d
(hapus cabang) pada masing-masing hasil. Atau Anda bisa membaca tautan More info yang disediakan dalam jawaban;)git branch --merged master | egrep -v '^\s*\*?\s*master$' | xargs git branch -d
. Output dari git v2.10.1 akan menampilkan "* master" saat master di-check out. Saya menyingkirkan master baik dengan atau tanpa tanda bintang.Di tengah informasi yang disajikan oleh
git help fetch
, ada item kecil ini:Jadi, mungkin,
git fetch -p
apa yang Anda cari?EDIT: Ok, bagi mereka yang masih memperdebatkan jawaban ini 3 tahun setelah fakta, berikut adalah sedikit informasi tentang mengapa saya mempresentasikan jawaban ini ...
Pertama, OP mengatakan mereka ingin "menghapus juga cabang-cabang lokal yang dibuat dari cabang-cabang terpencil [yang tidak ada lagi di remote]". Ini tidak mungkin secara ambigu dalam
git
. Ini sebuah contoh.Katakanlah saya memiliki repo di server pusat, dan memiliki dua cabang, dipanggil
A
danB
. Jika saya mengkloning repo itu ke sistem lokal saya, klon saya akan memiliki referensi lokal (belum cabang sebenarnya) yang dipanggilorigin/A
danorigin/B
. Sekarang katakanlah saya melakukan hal berikut:Fakta terkait di sini adalah bahwa saya karena suatu alasan memilih untuk membuat cabang pada repo lokal saya yang memiliki nama yang berbeda dari asalnya, dan saya juga memiliki cabang lokal yang (belum) ada pada repo asal.
Sekarang katakanlah saya menghapus kedua
A
danB
cabang pada repo jarak jauh dan memperbarui repo lokal saya (git fetch
dari beberapa bentuk), yang menyebabkan referensi lokal sayaorigin/A
danorigin/B
menghilang. Sekarang, repo lokal saya memiliki tiga cabang masih,A
,Z
, danC
. Tak satu pun dari ini memiliki cabang yang sesuai pada repo jarak jauh. Dua dari mereka "diciptakan dari ... cabang-cabang terpencil", tetapi bahkan jika saya tahu bahwa dulu ada cabang yang disebutB
asal, saya tidak punya cara untuk mengetahui bahwaZ
itu diciptakan dariB
, karena diganti namanya dalam proses, mungkin karena alasan yang baik. Jadi, sungguh, tanpa beberapa proses eksternal merekam metadata asal cabang, atau manusia yang mengetahui sejarah, tidak mungkin untuk mengatakan yang mana dari tiga cabang, jika ada, OP menargetkan untuk dihapus. Tanpa beberapa informasi eksternal yanggit
tidak secara otomatis menjaga untuk Anda,git fetch -p
adalah sedekat yang Anda bisa dapatkan, dan metode otomatis apa pun untuk benar-benar mencoba apa yang diminta OP berisiko mengambil terlalu banyak cabang, atau melewatkan beberapa yang OP akan sebaliknya ingin dihapus.Ada skenario lain, juga, seperti jika saya membuat tiga cabang terpisah
origin/A
untuk menguji tiga pendekatan berbeda untuk sesuatu, dan kemudianorigin/A
hilang. Sekarang saya memiliki tiga cabang, yang jelas tidak semuanya cocok dengan nama-bijaksana, tetapi mereka diciptakan dariorigin/A
, sehingga interpretasi literal dari pertanyaan OPs akan membutuhkan penghapusan ketiganya. Namun, itu mungkin tidak diinginkan, jika Anda bahkan dapat menemukan cara yang dapat diandalkan untuk mencocokkannya ...sumber
Ini akan menghapus cabang lokal tempat cabang pelacakan jarak jauh telah dipangkas. (Pastikan Anda berada di
master
cabang!)Detail:
git branch -vv
menampilkan "pergi" untuk cabang-cabang lokal bahwa remote telah dipangkas.-d
akan memeriksa apakah telah digabung (-D
akan menghapusnya terlepas)sumber
git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
git branch -d
membandingkan cabang melawanHEAD
.prunelocal = !sh -c \"git checkout -q master && git fetch -q --prune && git branch -vv | git grep ': gone]' | cut -d' ' -f3 | xargs git branch -d\"
Seseorang dapat mengkonfigurasi Git untuk secara otomatis menghapus referensi ke cabang jarak jauh yang dihapus saat mengambil:
Saat menelepon
git fetch
ataugit pull
sesudahnya, referensi ke cabang jauh yang dihapus bisa dihapus secara otomatis.sumber
git branch -r
.Ada paket NPM rapi yang melakukannya untuk Anda (dan itu harus bekerja lintas platform).
Instal dengan:
npm install -g git-removed-branches
Dan kemudian
git removed-branches
akan menunjukkan semua cabang lokal basi, dangit removed-branches --prune
untuk benar-benar menghapusnya.Info lebih lanjut di sini.
sumber
npx git-removed-branches
bekerja seperti mimpi.Solusi Windows
Untuk Microsoft Windows Powershell:
git checkout master; git remote update origin --prune; git branch -vv | Select-String -Pattern ": gone]" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}
Penjelasan
git checkout master
beralih ke cabang mastergit remote update origin --prune
memangkas cabang-cabang terpencilgit branch -vv
mendapat output verbose dari semua cabang ( referensi git )Select-String -Pattern ": gone]"
hanya mendapat catatan di mana mereka telah dihapus dari jarak jauh.% { $_.toString().Split(" ")[0]}
dapatkan nama cabang% {git branch -d $_}
menghapus cabangsumber
git remote prune origin
-string juga sepertinya tidak cocok dengan versi terbaru git. Pertimbangkan untuk menggunakanConvertFrom-String -TemplateContent
git checkout master; git pull; git remote prune origin; git branch --merged | select-string -notmatch "master" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}
Ini akan mencantumkan cabang lokal yang cabang pelacakan jarak jauh dihapus dari jarak jauh
Jika Anda ingin menghilangkan referensi cabang lokal ini dari lokal yang tidak terlacak
sumber
Sebagai catatan @tzacks ... ada paket npm yang berguna untuk ini. Kerjakan saja:
(Saya akan berkomentar tetapi tidak cukup reputasi)
sumber
Jika menggunakan Windows dan Powershell, Anda dapat menggunakan yang berikut untuk menghapus semua cabang lokal yang telah digabungkan ke cabang yang saat ini diperiksa:
Penjelasan
git
output untuk setiap nama cabang yang tersisaSebaiknya jalankan
git branch --merged
sendiri dengan sendirinya hanya untuk memastikan itu hanya akan menghapus apa yang Anda harapkan.(Porting / otomatis dari http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositor// )
sumber
Satu-liner yang lebih pendek dan lebih aman:
Pastikan untuk checkout ke cabang yang belum digabung, sebelum menjalankannya. Karena Anda tidak dapat menghapus cabang yang saat ini Anda laporkan.
sumber
git branch -d $(git branch --merged | cut -c 3- | grep -v master)
Saya menginginkan sesuatu yang akan membersihkan semua cabang lokal yang melacak cabang jarak jauh, pada
origin
, di mana cabang jarak jauh telah dihapus (gone
). Saya tidak ingin menghapus cabang lokal yang tidak pernah disetel untuk melacak cabang jarak jauh (yaitu: cabang dev lokal saya). Juga, saya ingin satu-liner sederhana yang hanya menggunakangit
, atau alat CLI sederhana lainnya, daripada menulis skrip khusus. Saya akhirnya menggunakan sedikitgrep
danawk
untuk membuat perintah sederhana ini, kemudian menambahkannya sebagai alias di blog saya~/.gitconfig
.Berikut adalah
git config --global ...
perintah untuk menambahkan ini dengan mudahgit prune-branches
:CATATAN: Penggunaan
-D
benderagit branch
bisa sangat berbahaya. Jadi, dalam perintah config di atas saya menggunakan-d
opsi untukgit branch
daripada-D
; Saya menggunakan-D
konfigurasi aktual saya. Saya menggunakan-D
karena saya tidak ingin mendengar Git mengeluh tentang ranting-ranting yang tidak terbakar, saya hanya ingin mereka pergi. Anda mungkin menginginkan fungsi ini juga. Jika demikian, cukup gunakan-D
alih-alih-d
di akhir perintah konfigurasi itu.sumber
Untuk menghapus cabang jarak jauh:
Untuk menghapus cabang lokal yang sudah digabungkan:
sumber
Tampaknya tidak ada one-liner yang aman, terlalu banyak kasus tepi (seperti cabang yang memiliki "master" sebagai bagian dari namanya, dll). Paling aman adalah langkah-langkah ini:
git branch -vv | grep 'gone]' > stale_branches.txt
awk '{print $1}' stale_branches.txt | xargs git branch -d
sumber
Berdasarkan jawaban di atas, saya menggunakan liner yang lebih pendek ini:
Juga, jika Anda sudah memangkas dan memiliki cabang menjuntai lokal, maka ini akan membersihkannya:
sumber
/
di dalamnyatidak yakin bagaimana melakukan semuanya sekaligus, tetapi git
git branch -d <branchname>
akan menghapus cabang lokal SAJA jika benar-benar digabungkan. Perhatikan huruf kecil d.git branch -D <branchname>
(perhatikan ibukota D) akan menghapus cabang lokal terlepas dari status gabungannya.sumber
Anda dapat menggunakan perintah ini:
Git Clean: Hapus Cabang yang Sudah-Digabung termasuk penguraian perintah
sumber
Berdasarkan jawaban di atas saya datang dengan solusi satu baris ini:
sumber
Menggunakan varian pada jawaban @ wisbucky, saya menambahkan yang berikut sebagai alias ke
~/.gitconfig
file saya :Dengan ini, simpel
git pruneitgood
akan membersihkan cabang lokal & jarak jauh yang tidak lagi dibutuhkan setelah penggabungan.sumber
Versi Powershell dari
git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d
git branch --merged master | %{ if($_ -notmatch '\*.*master'){ git branch -d "$($_.Trim())" }}
Ini akan menghapus semua cabang lokal yang telah digabungkan menjadi master, saat Anda berada di cabang master .
git checkout master
untuk menukar.sumber
Varian Schleis tidak berfungsi untuk saya (Ubuntu 12.04), jadi izinkan saya mengusulkan varian (jelas dan mengkilap :) saya:
Varian 1 (Saya lebih suka opsi ini):
Varian 2:
Sebuah. Lari kering:
b. Hapus cabang:
sumber
Berikut ini adalah adaptasi dari jawaban @ wisbucky untuk pengguna Windows:
for /f "tokens=1" %i in ('git branch -vv ^| findstr ": gone]"') DO git branch %i -d
Saya menggunakan posh-git dan sayangnya PS tidak suka yang telanjang
for
, jadi saya membuat skrip perintah polos bernama PruneOrphanBranches.cmd:Sebut saja tanpa parameter untuk melihat daftar, lalu panggil dengan "-d" untuk melakukan penghapusan atau "-D" yang sebenarnya untuk cabang apa pun yang tidak sepenuhnya digabungkan tetapi yang ingin Anda hapus tetap.
sumber
:
atau:
(dengan spasi) difindstr
menyebabkannya untuk mencocokkan segalanya setiap waktu - saya hampir menghapus master. Namun, menggunakan regex bekerja dengan baik:git branch -vv ^| findstr /R " \[origin/[0-9]+: gone\] "
Coba ini di git bash, untuk mengambil dan memangkas referensi ke cabang yang dihapus, dan kemudian memangkas cabang lokal yang melacak yang dihapus:
Ingatlah untuk checkout terlebih dahulu cabang yang tidak akan dihapus, sehingga tidak memblokir penghapusan cabang.
sumber
Saya telah mengubah jawaban yang diterima menjadi skrip yang kuat. Anda akan menemukannya di repositori git-extensions saya .
sumber
Saya mencapai halaman ini mencari jawaban untuk "bagaimana cara saya menghapus cabang yang diperiksa secara lokal yang tidak lagi memiliki cabang di hulu"
Saya juga tidak peduli apakah cabang lokal telah digabung atau belum, karena pemipaan ke
git branch -d
hanya akan memperingatkan, bukannya menghapus cabang lokal yang tidak dimusnahkan.sumber
Dalam Powershell :
sumber
Inilah solusi saya:
-p adalah untuk menghapus referensi pelacakan jarak jauh yang tidak lagi ada di remote. Jadi langkah pertama akan menghapus referensi ke cabang jarak jauh.
-vv adalah untuk menunjukkan sha1 dan melakukan baris subjek untuk setiap kepala, bersama dengan hubungan dengan cabang hulu (jika ada). Langkah ke-2 akan mendapatkan semua cabang lokal dan perintah grep akan menyaring cabang yang telah dihapus.
sumber
git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
Hapus cabang apa pun yang tidak mutakhir dengan master
sumber
Saya cukup yakin itu
git remote prune origin
yang Anda inginkan.Anda dapat menjalankannya
git remote prune origin --dry-run
untuk melihat apa yang akan dilakukannya tanpa membuat perubahan apa pun.sumber
Menggunakan GUI? Prosedur manual, tetapi cepat dan mudah.
Pilih "Cabang -> Hapus". Anda dapat memilih beberapa cabang dengan klik ctrl (windows) dan menghapus semuanya.
sumber