git silme uzaktan kumandaları: uzak referanslar mevcut değil


107

Kısacası;

  • Uzak birden çok birleştirilmiş uzaktan kumandayı nasıl silebilirim?

Daha fazla arka plan;

Master olarak birleştirilen onlarca uzaktan kumandaya sahip bir git repom var. Şunları kullanarak bu uzaktan kumandaları birer birer silebilirim:

git push --delete origin myBranch-1234

Ancak bu, tüm uzaktan kumandalar için yavaş ve sıkıcı bir süreçtir. Bu yüzden şu komutu deniyorum:

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

git branch -r --mergedbirleştirilmiş tüm uzaktan kumandaları listeler.
grep originkomuta orijini dahil etmesini söyler.
grep -v masterkomuta master'ı dışlamasını söyler.
xargs git push origin --deletekomuta uzaktan kumanda listesinin silinmesini söyler.

Hep birlikte, bunun birleştirilmiş tüm uzaktan kumandaları toplamasını ve silmesini bekliyorum.

Yukarıdaki komutu çalıştırdığımda, birleştirilen her uzaktan kumanda için aşağıdakileri alıyorum;

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

Ancak bu uzaktan kumandalar var ve her birini kontrol edebilirim. Birçok site ve kişi, git fetch --pruneeksik referansları temizlemek için çalışmamı tavsiye ediyor . Bu hiçbir şey yapmaz çünkü tüm bu uzaktan kumandalar mevcuttur.

Bu yüzden size soruyorum, sevgili yığın değişimi;

  • Neden bir uzaktan kumandayı silebilirim, ancak çok fazla değil?
  • Benim emrim doğru mu?

Sanırım küçük bir şey kaçırıyorum. Bunu her araştırdığımda, bunu doğru yapıyormuşum gibi görünüyor, ancak yukarıdaki hataları alıyorum.

Yanıtlar:


226

Önce uzak şubelerin yerel "önbelleğini" budamanız gerekebilir. Koşmayı deneyin:

git fetch -p origin

silmeden önce.


2
Bu benim için çözdü, teşekkürler! Ancak, olmadan getirdiğimde neden güncellenmiyor --prune? Bence bu oldukça yanıltıcı
dave0688

6
Buraya bir aramadan gelen insanlar için bir not - bu buraya gelen çoğunluk için açıkça faydalı olsa da, asıl sorun açısından aslında doğru değil - OP'nin sorunu, komutunun origin/açıklandığı gibi şube adlarına yanlış bir şekilde dahil edilmesiydi. / diğer yanıtlarda çözüldü.
CupawnTae

104

Bu dallar uzaktaki (başlangıç ​​noktasından) kaldırıldı mı? Cevabınız evet ise, kolayca yapabilirsiniz

git fetch --prune origin

Aksi takdirde, yerel olarak sildikten sonra bile geri dönebilirler.

Güncelleme: Komutunuza tekrar baktığınızda, onu yanlış oluşturuyormuşsunuz gibi görünüyor. Muhtemelen istiyorsun

git push origin --delete myBranch-1234

ama bunun yerine şöyle bir şey yapıyorsun

git push origin --delete origin/myBranch-1234

Dalların hiçbiri orijinden çıkarılmaz. Herhangi birini kontrol edebilirim.
Jqw

1
evet, çünkü ikinci durumda farklı komutları çalıştırırsınız.
Mykola Gurov

1
Demek istediğini anlamıyorum. İki farklı komut kullandığımı biliyorum. İkinci durum, tüm birleştirilmiş uzaktan kumandaları alıyor git branch -r --mergedve sonra onları silmeye çalışıyorum xargs git push origin --delete. Komut, uzaktan kumandaları silmeye çalışıyor remote ref does not exist.
Jqw

1
ikinci borulu komutunuzda, xargsgerçekte neyin yürütüldüğünü görmek için yanına echo koyun .
Mykola Gurov

2
@Jqw origin/Şube adına öneki ekleyemezsiniz , git çalıştırdığınızdan beri orijinin şubeleriyle çalıştığınızı zaten biliyor git push origin. Mykola'nın önerisi, komutanın son kısmını xargs echoyerine getirmek oldu echo xargs [...].
Matthew

15

Kullan sed'köken /' kısmını çıkarın ve bir lttile değiştirmeye xargsparçasını.

git branch -r --merged | grep origin | grep -v -e master | sed s/origin\\/// |  xargs -I{} git push origin --delete {}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.