git delete remote: referensi jarak jauh tidak ada

107

Pendeknya;

  • Bagaimana cara menghapus remote beberapa remote gabungan?

Lebih banyak latar belakang;

Saya memiliki git repo dengan puluhan remote yang telah digabungkan menjadi master. Saya dapat menghapus remote ini satu per satu dengan menggunakan:

git push --delete origin myBranch-1234

Namun ini adalah proses yang lambat dan membosankan untuk semua remote. Jadi saya mencoba perintah ini:

git branch -r --merged | grep origin | grep -v master | xargs git push origin --delete

git branch -r --mergedmencantumkan semua remote yang digabungkan.
grep originmemberi tahu perintah untuk menyertakan asal.
grep -v mastermemberi tahu perintah untuk mengecualikan master.
xargs git push origin --deletememberi tahu perintah untuk menghapus daftar remote.

Secara keseluruhan, saya berharap ini mengumpulkan semua remote yang digabungkan dan menghapusnya.

Ketika saya menjalankan perintah di atas, saya menerima yang berikut untuk setiap remote yang digabungkan;

error: unable to delete 'origin/myBranch-1234': remote ref does not exist
error: unable to delete 'origin/myBranch-1235': remote ref does not exist
error: unable to delete 'origin/myBranch-1236': remote ref does not exist
error: unable to delete 'origin/myBranch-1237': remote ref does not exist
... etc

Namun remote ini memang ada dan saya dapat melakukan pembayaran masing-masing. Banyak situs dan orang merekomendasikan agar saya menjalankan git fetch --pruneuntuk membersihkan referensi yang hilang. Ini tidak melakukan apa-apa karena semua remote ini ada.

Jadi saya meminta Anda, pertukaran tumpukan sayang;

  • Mengapa saya dapat menghapus satu remote, tapi tidak banyak?
  • Apakah perintah saya benar?

Saya pikir saya kehilangan sesuatu yang kecil. Setiap kali saya meneliti ini, sepertinya saya melakukan ini dengan benar, tetapi saya mendapatkan kesalahan di atas.

Jqw
sumber

Jawaban:

226

Anda mungkin perlu memangkas "cache" lokal Anda dari cabang jarak jauh terlebih dahulu. Coba jalankan:

git fetch -p origin

sebelum menghapus.

Igor
sumber
2
Itu menyelesaikannya untuk saya, terima kasih! Namun, mengapa tidak diperbarui saat saya mengambil tanpa --prune? Menurut pendapat saya itu cukup menyesatkan
dave0688
6
Hanya sebuah catatan untuk orang-orang yang datang ke sini dari pencarian - meskipun ini jelas berguna bagi mayoritas yang mendarat di sini, sebenarnya itu tidak benar dalam hal masalah aslinya - masalah OP adalah bahwa perintahnya secara tidak tepat dimasukkan origin/dalam nama cabang, seperti yang dijelaskan / diselesaikan dalam jawaban lain.
CupawnTae
104

Apakah cabang-cabang tersebut dihapus dari remote (asal)? Jika ya, Anda dapat melakukannya

git fetch --prune origin

Jika tidak, mereka mungkin kembali bahkan setelah Anda menghapusnya secara lokal.

Pembaruan: Melihat perintah Anda lagi, sepertinya Anda salah membuatnya. Anda mungkin ingin

git push origin --delete myBranch-1234

tetapi sebaliknya Anda melakukan sesuatu seperti

git push origin --delete origin/myBranch-1234
Mykola Gurov
sumber
Tidak ada cabang yang dibuang asalnya. Saya bisa membayar salah satu dari mereka.
Jqw
1
ya, karena Anda menjalankan perintah yang berbeda dalam kasus kedua.
Mykola Gurov
1
Saya tidak mengerti maksud Anda. Saya tahu bahwa saya menggunakan dua perintah berbeda. Kasus kedua adalah mendapatkan semua remote yang digabungkan git branch -r --mergeddan kemudian saya mencoba untuk menghapusnya dengan xargs git push origin --delete. Perintah mencoba untuk menghapus remote kecuali yang dianggap remote ref does not exist.
Jqw
1
di perintah kedua Anda yang sudah di-pipet, letakkan echo di sebelah kanan xargsuntuk melihat apa yang sebenarnya dieksekusi.
Mykola Gurov
2
@Jqw Anda tidak dapat menyertakan origin/awalan pada nama cabang, git sudah mengetahui Anda sedang bekerja dengan cabang asal sejak Anda menjalankan git push origin. Saran Mykola adalah membuat bagian terakhir dari perintah itu xargs echo, bukan echo xargs [...].
Matius Baca
15

Gunakan seduntuk menghapus bagian 'origin /' dan mengubah xargsbagian lttile .

git branch -r --merged | grep origin | grep -v -e master | sed s/origin\\/// |  xargs -I{} git push origin --delete {}
kost
sumber