Saya biasanya tidak akan menjawab pertanyaan yang sudah memiliki 16 jawaban, tetapi semua jawaban lainnya salah, dan jawaban yang benar sangat sederhana. Pertanyaannya mengatakan, "Apakah ada cara sederhana untuk menghapus semua cabang pelacakan yang setara jarak jauh tidak ada lagi?"
Jika "sederhana" berarti menghapus semuanya sekaligus, tidak rapuh, tidak berbahaya, dan tanpa bergantung pada alat yang tidak dimiliki semua pembaca, maka jawaban yang tepat adalah: tidak.
Beberapa jawaban sederhana, tetapi mereka tidak melakukan apa yang diminta. Yang lain melakukan apa yang diminta, tetapi tidak sederhana: semua bergantung pada penguraian output Git melalui perintah manipulasi teks atau bahasa scripting, yang mungkin tidak ada pada setiap sistem. Selain itu, sebagian besar saran menggunakan perintah porselen, yang outputnya tidak dirancang untuk diuraikan oleh skrip ("porselen" mengacu pada perintah yang dimaksudkan untuk operasi manusia; skrip harus menggunakan perintah "plumbing" tingkat rendah).
Bacaan lebih lanjut:
Jika Anda ingin melakukan ini dengan aman, untuk kasus penggunaan dalam pertanyaan (cabang pelacakan pengumpulan sampah yang telah dihapus di server tetapi masih ada sebagai cabang lokal) dan dengan perintah Git tingkat tinggi saja, Anda harus
git fetch --prune
(atau git fetch -p
, yang merupakan alias, atau git prune remote origin
yang melakukan hal yang sama tanpa mengambil, dan mungkin bukan yang Anda inginkan sebagian besar waktu).
- Perhatikan semua cabang jarak jauh yang dilaporkan telah dihapus. Atau, untuk menemukannya nanti,
git branch -v
(cabang pelacakan yatim mana pun akan ditandai "[hilang]").
git branch -d [branch_name]
pada setiap cabang pelacakan yatim
(yang mana beberapa jawaban lain usulkan).
Jika Anda ingin membuat skrip solusi, maka for-each-ref
adalah titik awal Anda, seperti dalam jawaban Mark Longair di sini dan jawaban ini untuk pertanyaan lain , tapi saya tidak bisa melihat cara untuk mengeksploitasinya tanpa menulis loop skrip shell, atau menggunakan xargs atau sesuatu .
Penjelasan latar belakang
Untuk memahami apa yang terjadi, Anda perlu menghargai itu, dalam situasi pelacakan cabang, Anda tidak memiliki satu cabang, tetapi tiga. (Dan ingat bahwa "cabang" berarti hanya penunjuk ke komit.)
Diberikan cabang pelacakan feature/X
, repositori jarak jauh (server) akan memiliki cabang ini dan menyebutnya feature/X
. Repositori lokal Anda memiliki cabang remotes/origin/feature/X
yang artinya, "Ini adalah remote yang memberi tahu saya fitur / cabang X-nya, terakhir kali kami berbicara," dan akhirnya, repositori lokal memiliki cabang feature/X
yang menunjuk ke komit terbaru Anda, dan dikonfigurasikan ke "lacak" remotes/origin/feature/X
, artinya Anda dapat menarik dan mendorong agar tetap selaras.
Pada titik tertentu, seseorang telah menghapus feature/X
di remote. Sejak saat itu, Anda ditinggalkan dengan lokal Anda feature/X
(yang mungkin Anda tidak mau lagi, karena bekerja pada fitur X mungkin selesai), dan Anda remotes/origin/feature/X
yang tentu saja tidak berguna karena satu-satunya tujuan adalah untuk mengingat keadaan cabang server .
Dan Git akan membiarkan Anda secara otomatis membersihkan yang mubazir remotes/origin/feature/X
- itulah yang git fetch --prune
terjadi - tetapi untuk beberapa alasan, itu tidak memungkinkan Anda secara otomatis menghapus sendiri feature/X
... meskipun Anda feature/X
masih berisi informasi pelacakan yatim, sehingga ia memiliki informasi untuk mengidentifikasi bekas cabang pelacakan yang telah sepenuhnya digabung. (Lagi pula, itu dapat memberi Anda informasi yang memungkinkan Anda melakukan operasi sendiri.)
* master
di sistem saya. Perintah berikut bekerja untuk saya:git branch -d $(git branch --merged |tail -n +2)