git pemangkasan jarak jauh - tidak menunjukkan cabang yang dipangkas sebanyak yang saya harapkan

113

Dari halaman manual:

Deletes all stale tracking branches under <name>.
These stale branches have already been removed from the remote repository
referenced by <name>, but are still locally available in "remotes/<name>".

Jadi saya menghapus banyak cabang menggunakan

git push origin :staleStuff

dan kemudian lari

git remote prune origin

Namun, hanya satu cabang lokal yang dipangkas. Beberapa cabang ini dibuat oleh saya, beberapa oleh rekan kerja. Apakah ini menunjukkan bahwa saya tidak melacak cabang tersebut dengan benar sejak awal?

Felixyz
sumber
7
untuk mengetahui cabang apa yang akan dihilangkan, Anda dapat melakukannya git remote show origindan mencari cabang yang bertandastale
Seseorang di suatu tempat

Jawaban:

189

Saat Anda menggunakannya git push origin :staleStuff, secara otomatis menghapus origin/staleStuff, jadi saat Anda menjalankan git remote prune origin, Anda telah memangkas beberapa cabang yang telah dihapus oleh orang lain. Kemungkinan besar rekan kerja Anda sekarang perlu lari git pruneuntuk menyingkirkan cabang yang telah Anda hapus.


Jadi apa sebenarnya yang git remote prunedilakukannya? Ide utama: cabang lokal (bukan cabang pelacakan) tidak tersentuh oleh git remote pruneperintah dan harus dihapus secara manual.

Sekarang, contoh dunia nyata untuk pemahaman yang lebih baik:

Anda memiliki repositori jarak jauh dengan 2 cabang: masterdan feature. Anggaplah Anda sedang mengerjakan kedua cabang, sehingga Anda memiliki referensi ini di repositori lokal Anda (nama referensi lengkap diberikan untuk menghindari kebingungan):

  • refs/heads/master(nama pendek master)
  • refs/heads/feature(nama pendek feature)
  • refs/remotes/origin/master(nama pendek origin/master)
  • refs/remotes/origin/feature(nama pendek origin/feature)

Sekarang, skenario tipikal:

  1. Beberapa pengembang lain menyelesaikan semua pekerjaan feature, menggabungkannya ke masterdan menghapus featurecabang dari repositori jarak jauh.
  2. Secara default, ketika Anda melakukan git fetch(atau git pull), tidak ada referensi yang dihapus dari repositori lokal Anda, jadi Anda masih memiliki semua 4 referensi tersebut.
  3. Anda memutuskan untuk membersihkannya, dan lari git remote prune origin.
  4. git mendeteksi bahwa featurecabang tidak ada lagi, sehingga refs/remotes/origin/featureadalah basi cabang yang harus dihapus.
  5. Sekarang Anda memiliki 3 referensi, termasuk refs/heads/feature, karena git remote prunetidak menghapus refs/heads/*referensi apa pun .

Anda dapat mengidentifikasi cabang lokal, yang terkait dengan cabang pelacakan jarak jauh, dengan branch.<branch_name>.mergeparameter konfigurasi. Parameter ini tidak benar-benar diperlukan agar apa pun berfungsi (mungkin kecuali git pull), jadi mungkin saja hilang.

(diperbarui dengan contoh & info berguna dari komentar)

maks
sumber
Saya memahami situasinya: cabang masih ada secara lokal tetapi dihapus dari repo jarak jauh. Sekarang saya ingin menghapus semua cabang lokal yang tidak ada di remote, oleh karena itu saya menjalankan git prune. Itulah yang dikatakan "Cabang usang ini telah dihapus dari repositori jarak jauh" kepada saya. Apakah aku salah?
Felixyz
3
Anda benar, tetapi Anda mungkin salah paham tentang arti "cabang lokal" dalam kasus git prune. Hanya cabang di /refs/remotes/<remote_name>/yang tunduk pada pemangkasan; cabang mana pun /refs/heads/tidak akan tersentuh - Anda harus mengelolanya secara manual.
maks
Aha, memang itu yang kupikirkan. Jadi tidak ada cara untuk melakukan apa yang saya inginkan: secara otomatis menghapus semua cabang di kepala yang melacak cabang jarak jauh, dengan memeriksa apakah cabang jarak jauh itu dihapus?
Felixyz
2
Tidak ada perintah bawaan untuk itu, tetapi Anda dapat menulis skrip tersebut sendiri. Cabang pelacakan dapat diidentifikasi dengan adanya branch.<branch_name>.mergeparameter config.
maks
Jawaban ini akan lebih baik jika Anda menambahkan informasi di komentar ke dalam jawaban itu sendiri sehingga semua orang yang datang ke sini dan memiliki kesalahpahaman yang sama seperti @Felixyz tidak harus melihat jawaban Anda lucu dan kemudian membaca komentar untuk akhirnya mendapatkan pemahaman .
Akrikos