Bagaimana Anda menghapus referensi cabang jarak jauh yang tidak valid dari Git?

731

Dalam repo saya saat ini, saya memiliki output berikut:

$ git branch -a
* master
  remotes/origin/master
  remotes/public/master

Saya ingin menghapus remotes/public/masterdari daftar cabang:

$ git branch -d remotes/public/master
error: branch 'remotes/public/master' not found.

Juga, output git remoteaneh, karena tidak mencantumkan public:

$ git remote show 
origin

Bagaimana saya bisa menghapus 'remote / publik / master' dari daftar cabang?

Perbarui, coba git pushperintah:

$ git push public :master
fatal: 'public' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
cmcginty
sumber
31
Apakah berhasil git remote prune [remote-name]atau git fetch -p [remote-name]tidak dalam skenario Anda? Melakukannya dengan git gcjauh lebih kuat dari biasanya.
rjmunro
6
git remote prune [remote-name]tidak akan bekerja dengan git svn, meskipun tidak git gc... git branch -rd origin/nametidak bekerja. @ Casey, Anda mungkin harus memilih jawaban kedua - itu sedikit kurang berbahaya.
naught101
4
Saya suka pertanyaan ini. Kembali hampir setiap bulan
oluckyman
Terkait, jika bukan target penipuan: Hapus cabang Git secara lokal dan jarak jauh .
2
Untuk menghindari kesalahan n00b gitter di masa depan, saya sarankan menggunakan cabang contoh yang berbeda dari master... terutama ketika menghapus pada remote.
absynce

Jawaban:

743

Anda mungkin perlu pembersihan:

git gc --prune=now

atau Anda mungkin perlu memangkas:

git remote prune public

memangkas

Menghapus semua cabang pelacakan basi di bawah <name>. Cabang-cabang basi ini telah dihapus dari repositori jarak jauh yang dirujuk oleh <name>, tetapi masih tersedia secara lokal di "remote / <nama>".

Dengan opsi --dry-run, laporkan cabang apa yang akan dipangkas, tetapi jangan melakukan pemangkasan yang sebenarnya.

Namun, tampaknya ini harus dibersihkan dengan sebelumnya

git remote rm public 

rm

Hapus remote yang bernama <name>. Semua cabang pelacakan jarak jauh dan pengaturan konfigurasi untuk jarak jauh dihapus.

Jadi mungkin Anda mengedit file konfigurasi Anda dan ini tidak terjadi, atau Anda memiliki masalah hak istimewa.

Mungkin jalankan itu lagi dan lihat apa yang terjadi.


Konteks Saran

Jika Anda melihat dalam log revisi , Anda akan perhatikan saya menyarankan lebih banyak teknik "benar", yang karena alasan apa pun tidak ingin mengerjakan repositori mereka.

Saya curiga OP telah melakukan sesuatu yang meninggalkan pohon mereka dalam keadaan tidak konsisten yang menyebabkannya berperilaku agak aneh, dan git gcdiminta untuk memperbaiki sisa belitan.

Biasanya git branch -rd origin/badbranch cukup untuk nuking cabang pelacakan lokal, atau git push origin :badbranchuntuk nuking cabang terpencil, dan biasanya Anda tidak perlu menelepongit gc

Kent Fredric
sumber
4
Saya tidak ingin menghapus cabang di sisi jarak jauh. Saya pikir ada perbedaan kecil.
cmcginty
2
eh, pertanyaannya adalah menanyakan secara efektif "bagaimana cara menghapus cabang jarak jauh". Itulah jalan itu.
Kent Fredric
1
Saya akan mengubah topik pembicaraan jika itu membuatnya lebih jelas apa yang saya minta, tetapi perintah menunjukkan dengan tepat apa masalah saya.
cmcginty
40
git gctidak diperlukan di sini, tetapi git remote prunemembuat saya merasa lebih aman daripada menghapus hal-hal secara manual git branch -rd, karena git memverifikasi cabang jarak jauh mana yang dilakukan.
Mike Seplowitz
3
ini tidak berhasil untuk saya - 'git branch -rd' bekerja dengan baik.
dsummersl
683

Yang perlu Anda lakukan adalah

git fetch -p

Ini akan menghapus semua cabang lokal Anda yang dihapus dari jarak jauh.

Jika Anda menggunakan git 1.8.5+ Anda dapat mengatur ini secara otomatis

git config fetch.prune true

atau

git config --global fetch.prune true
Pawan Maheshwari
sumber
7
Inilah yang saya cari - pertanyaannya adalah menggambarkan skenario yang lebih rumit daripada yang umum.
rjmunro
22
Saya mencari cara untuk menghapus cabang lokal di mana remote yang sesuai telah dihapus, tetapi ini tidak berhasil bagi saya. Ada yang tahu kenapa?
jackocnr
11
Ini menghapus cabang yang terdaftar di remote / asal tetapi tidak menghapus cabang pelacakan lokal, yang sama pentingnya.
BlueRaja - Danny Pflughoeft
@Cupcake Karena Anda tidak memutar kembali edit pertama saya (yang memperbaiki informasi yang salah tentang Git 1.8.5+), Anda sekarang telah membuat kesalahan ini. Sunting kedua saya memperbaiki apa yang saya masukkan tidak benar, yang sekarang ada lagi (dengan rollback Anda). Silakan lanjutkan dan putar kembali satu edit lagi untuk mendapatkan yang asli. Terima kasih.
ferventcoder
@ferventcoder Saya memeriksa ulang edit terakhir Anda, dan memutar kembali ke sana. OP dapat gulung lagi jika dia tidak menyukainya. Terima kasih.
319
git push public :master

Ini akan menghapus cabang jarak jauh yang dinamai masterKent Fredric.

Untuk membuat daftar cabang pelacak jarak jauh:

git branch -r

Untuk menghapus cabang pelacakan jarak jauh:

git branch -rd public/master
Alan Haggai Alavi
sumber
6
Ini membantu saya untuk menghapus cabang hantu remote git-svn.
Nick
9
git branch -rd removed_remote/branchbekerja untuk saya, sedangkan yang git gc --prune=nowtidak berharga.
rchampourlier
2
Saya sudah bisa menggunakan git prunetanpa masalah, tetapi rekan kerja saya yang membayar repo utama kami ** BISA HANYA ** menggunakan git branch -rd public/mastersolusi gaya untuk membersihkan lingkungannya.
Abel
3
git branch -rd public/masteradalah apa yang saya lewatkan. Saya punya heroku/masterdan herkou/master... lol woops
Aaron
@rchampourlier Tidak 100% tidak bernilai - jika repo git Anda besar, menghapus cabang-cabang yang tidak digunakan dapat membebaskan banyak ruang disk dalam beberapa situasi.
peterh
159

Yang perlu Anda lakukan adalah

$ git branch -rd origin/whatever 

Sesederhana itu. Tidak ada alasan untuk memanggil gc di sini.

jpswain
sumber
1
bagaimana Anda "mendorong" penghapusan itu ke github?
Thufir
14
@ Thufir Bukan itu pertanyaannya. Pertanyaan ini khusus untuk situasi ketika Anda memiliki referensi jarak jauh yang tidak valid di repo lokal, tetapi cabang itu tidak lagi ada di server jarak jauh. Jawaban atas pertanyaan Anda adalah $ git push origin: whatever
jpswain
Ya, jika sesuatu terjadi pada repo jarak jauh di mana cabang dihapus, tetapi Anda masih memiliki referensi ke cabang jarak jauh itu di mesin lokal Anda, maka Anda perlu melakukan apa yang saya masukkan dalam jawaban asli saya untuk membersihkannya.
jpswain
6
Jika Anda memiliki pekerjaan pembersihan yang besar (banyak remote yang menggantung), Anda bisa menghapus semua cabang jarak jauh dengan sesuatu seperti git branch -rd $(git branch -r)lalu membangun kembali yang valid dengan melakukan pengambilan.
Nobar
Situasi saya adalah saya biasa git config -emengganti nama remote saya. Saya mengganti nama remote minemenjadi origin. Kemudian, ini adalah solusi yang paling berhasil bagi saya:git branch -rd $(git branch -r | grep 'mine/')
Steven Lu
70

git gc --prune=now bukan apa yang kamu inginkan.

git remote prune public

atau git remote prune origin# jika itu sumber jarak jauh

adalah apa yang kamu inginkan

tongueroo
sumber
6
@Casey $ git gc # tidak seperti defragment untuk file git untuk mempercepat $ git asal repositori repositori asal # akan membersihkan penghapusan cabang-cabang remote basi yang muncul dengan "git branch -r | grep origin". Itulah pertanyaan yang saya tanyakan. Jadi, perintahnya sangat berbeda.
tongueroo
29

Jawaban yang diterima tidak bekerja untuk saya ketika wasit penuh sesak. Namun ini tidak:

$ git remote add public http://anything.com/bogus.git
$ git remote rm public
chris
sumber
Bekerja untukku. Cabang git biasa -d tidak berfungsi, mengembalikan kesalahan bahwa cabang tidak ada, karena saya menghapus asal yang disebut "asli", yang dibuat secara tidak sengaja, langsung dalam file .git / config.
micrub
Ini adalah metode yang harus saya gunakan untuk menghapus cabang yang secara tidak sengaja dihilangkan dari .git / config saya (yang harus dibangun kembali karena korupsi yang tidak terkait). Sayang sekali jawaban ini sangat jauh hingga saya tidak menyadarinya sampai akhirnya saya menemukan solusinya dan menambahkannya ke jawaban yang diterima!
taranaki
Inilah yang saya butuhkan setelah menggunakan svn2git. Ada banyak cabang remote / svn / *. Harus membuat jauh 'svn' palsu dulu.
Sam
7

Dalam kasus saya, saya mencoba menghapus entri yang disimpan .git/packed-refs. Anda dapat mengedit file teks biasa ini dan menghapus entri dari itugit br -D tidak tahu cara menyentuh (Setidaknya dalam ver 1.7.9.5).

Saya menemukan solusi ini di sini: https://stackoverflow.com/a/11050880/1695680

ThorSummoner
sumber
wow, ini membantu saya. Rekan saya mencoba, restart VS, Restart komputernya tidak ada yang berhasil, ia menghapus repo lokalnya dan menarik semuanya untuk menyingkirkan ini :)
Esen
1
Hari ini saya bersandar bahwa file paket-ref ini dibuat sebagai bagian dari git gc, ketika paket Anda mengkomit ke dalam arsip yang sangat terkompresi, file ini juga memindahkan referensi ke satu file teks biasa, mungkin untuk keperluan optimasi; Saya berharap versi git yang akan datang bisa git br -D ...memaket referensi.
ThorSummoner
3

Saya tidak tahu git branch -rd, jadi cara saya menyelesaikan masalah seperti ini untuk diri saya sendiri adalah memperlakukan repo saya sebagai repo jarak jauh dan melakukan penghapusan jarak jauh. git push . :refs/remotes/public/master. Jika cara lain tidak berhasil dan Anda memiliki referensi aneh yang ingin Anda singkirkan, cara mentah ini pasti. Ini memberi Anda ketepatan yang tepat untuk menghapus (atau membuat!) Segala jenis referensi.

klak
sumber
2

Hanya sedikit terkait, tetapi masih mungkin membantu dalam situasi yang sama seperti yang kami miliki - kami menggunakan berbagi file jaringan untuk repositori jarak jauh kami. Minggu lalu semuanya berjalan dengan baik, minggu ini kami mendapatkan kesalahan "Asal asli tidak mengiklankan referensi untuk ref / kepala / master cabang. Referensi ini mungkin tidak ada di remote atau mungkin disembunyikan oleh pengaturan izin"

Tapi kami percaya tidak ada yang dilakukan untuk merusak hal-hal. NFS melakukan snapshot jadi saya meninjau setiap "versi sebelumnya" dan melihat bahwa tiga hari yang lalu, ukuran dalam MB repositori telah berubah dari 282MB menjadi 33MB, dan sekitar 1.403 file baru dan 300 folder sekarang ada. Saya bertanya kepada rekan kerja saya dan seseorang telah mencoba mendorong hari itu - kemudian membatalkannya.

Saya menggunakan fungsionalitas "Kembalikan" NFS untuk mengembalikannya tepat sebelum tanggal tersebut dan sekarang semuanya berfungsi dengan baik lagi. Saya sudah mencoba memangkas sebelumnya, sepertinya tidak membantu. Mungkin pembersihan yang lebih keras akan berhasil.

Semoga ini bisa membantu orang lain suatu hari nanti!

Jay

JGlass
sumber
2

Saya punya masalah serupa. Tidak ada jawaban yang membantu. Dalam kasus saya, saya memiliki dua repositori jarak jauh yang dihapus yang muncul secara permanen.

Ide terakhir saya adalah menghapus semua referensi dengan tangan.

Katakanlah repositori disebut “Repo”. Aku melakukannya:

find .git -name Repo 

Jadi, saya menghapus file dan direktori yang sesuai dari folder .git ( folder ini dapat ditemukan di aplikasi Rails Anda atau di komputer Anda https://stackoverflow.com/a/19538763/6638513 ).

Lalu saya lakukan:

grep Repo -r .git

Ini menemukan beberapa file teks di mana saya menghapus baris yang sesuai. Sekarang, semuanya tampak baik-baik saja.

Biasanya, Anda harus meninggalkan pekerjaan ini untuk git.

Keinstein
sumber