Geçersiz bir uzak dal başvurusunu Git'ten nasıl kaldırırsınız?


731

Benim şimdiki repo aşağıdaki çıktı var:

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

remotes/public/masterŞube listesinden silmek istiyorum :

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

Ayrıca, git remotelistelemediği için çıktısı gariptir public:

$ git remote show 
origin

Şube listesinden 'uzaktan kumandalar / genel / master' ı nasıl silebilirim?

Güncelle, git pushkomutu denedi :

$ git push public :master
fatal: 'public' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

31
git remote prune [remote-name]yoksa git fetch -p [remote-name]senin senaryoda çalışmaz? Bunu yapmak git gcnormalde gerekenden çok daha güçlüdür.
rjmunro

6
git remote prune [remote-name]ne yapar rağmen, git svn ile çalışma olmaz git gc... git branch -rd origin/namegerçi çalışır. @Casey, muhtemelen ikinci cevabı seçmelisin - biraz daha az tehlikeli.
naught101

4
Bu soruyu seviyorum. Neredeyse her ay geri geliyor
oluckyman

İlgili, bir dupe hedefi değilse: Git dalını hem yerel hem de uzaktan silin .

2
Gelecekte n00b gitter hatasını önlemek için, masterözellikle uzaktan kumandayı silerken ... dışında bir örnek şube kullanmanızı öneririm .
absynce

Yanıtlar:


743

Bir temizliğe ihtiyacınız olabilir:

git gc --prune=now

ya da bir kuru erik lazım olabilir:

git remote prune public

kuru erik

<ad> altındaki tüm eski izleme dallarını siler. Bu eski dallar, <ad> tarafından referans verilen uzak depodan zaten kaldırılmış, ancak yine de yerel olarak "uzaktan kumandalar / <ad>" içinde kullanılabilir.

--Dry-run seçeneğiyle, hangi dalların budanacağını bildirin, ancak aslında budamaları yapmayın.

Ancak, bunların daha önce temizlenmesi gerekiyor gibi görünüyor.

git remote rm public 

rm

<ad> adlı uzaktan kumandayı kaldırın. Uzaktan kumandanın tüm izleme dalları ve yapılandırma ayarları kaldırılır.

Bu nedenle, yapılandırma dosyanızı elle düzenlediniz ve bu olmadı veya ayrıcalık sorunlarınız olabilir.

Belki onu tekrar çalıştır ve ne olacağını gör.


Tavsiye Bağlamı

Revizyon günlüklerine bakarsanız , depolarında çalışmak istemeyen daha "doğru" teknikler önerdiğimi fark edeceksiniz.

OP'nin ağaçlarını tutarsız bir durumda bırakan ve biraz garip davranmasına neden olan bir şey yaptığını git gcve soldaki rüzgârın arkasını düzeltmesi gerektiğini düşündüm.

Genellikle git branch -rd origin/badbranch yerel bir izleme şube nuking için veya yeterli git push origin :badbranchbir uzak şube nuking için ve genellikle , olur asla çağrısına gerekgit gc


4
Uzak taraftaki dalı silmek istemiyorum. Bence ince bir fark var.
cmcginty

2
soru, etkin bir şekilde "uzak bir dalı nasıl silebilirim" sorusunu soruyor. Bu yollar böyle.
Kent Fredric

1
Sorduğum şeyi daha net hale getirirse konuyu yeniden ifade edeceğim, ancak komut sorunumun tam olarak ne olduğunu gösteriyor.
cmcginty

40
git gcburada gerekli değildir, ancak git hangi uzak dalların yapıldığını doğruladığından, git remote prunekendimi elle silmekten daha güvenli hissetmemi sağlıyor git branch -rd.
Mike Seplowitz

3
bu benim için işe yaramadı - ancak 'git branch -rd' iyi çalıştı.
dsummersl

683

Tek yapman gereken

git fetch -p

Uzaktan silinen tüm yerel şubelerinizi kaldıracaktır.

Git 1.8.5+ kullanıyorsanız, bunu otomatik olarak ayarlayabilirsiniz.

git config fetch.prune true

veya

git config --global fetch.prune true

7
Ben de aradığım şey buydu - soru, sıradan olandan daha karmaşık bir senaryoyu tanımlamak.
rjmunro

22
İlgili uzaktan kumandanın silindiği yerel şubeleri silmek için bir yol arıyorum, ama bu benim için çalışmıyor. Neden olduğu hakkında bir fikrin var mı?
jackocnr

11
Bu, uzak / başlangıç ​​noktasında listelenen dalları kaldırır, ancak yerel izleme dallarını da silmez, bu da aynı derecede önemlidir.
BlueRaja - Danny Pflughoeft

@ Cupcake İlk düzenlememi (Git 1.8.5+ ile ilgili yanlış bilgileri düzeltiyordu) geri almadığınızdan, şimdi bunu yanlış yaptınız. İkinci düzenlemem yanlış olanı düzeltmekti, şimdi tekrar var (geri dönüşünüzle birlikte). Orijinali almak için lütfen devam edin ve bir düzenleme daha yapın. Teşekkürler.
ferventcoder

@ferventcoder Son düzenlemenizi iki kez kontrol ettim ve geri döndüm. OP beğenmezse tekrar geri dönebilir. Teşekkürler.

319
git push public :master

Bu master, Kent Fredric'in işaret ettiği uzak dalı silecektir .

Uzaktan izleme dallarını listelemek için:

git branch -r

Bir uzaktan izleme kolunu silmek için:

git branch -rd public/master

6
Bu git-svn uzak hayalet dalını kaldırmama yardımcı oldu.
Nick

9
git branch -rd removed_remote/branchgit gc --prune=nowdeğersiz iken benim için çalıştı .
rchampourlier

2
git pruneHerhangi bir sorun olmadan kullanabildim , ancak ana repolarımızı çatallayan iş arkadaşım ** SADECE ** git branch -rd public/masterçevreyi temizlemek için stil çözümünü kullanıyor .
Abel

3
git branch -rd public/mastereksik olduğum şeydi. Ben vardı heroku/masterve herkou/master... lol woops
Aaron

@rchampourlier% 100 değersiz değil - git deponuz büyükse, kullanılmayan dalları kaldırmak bazı durumlarda çok fazla disk alanı açabilir.
peterh - Monica

159

Tek yapman gereken

$ git branch -rd origin/whatever 

Bu kadar basit. Burada gc'yi aramak için bir neden yok.


1
silme işlemini github'a nasıl "zorlarsınız"?
Thufir

14
@Thufir Bu sorunun konusu bu değildi. Bu soru, yerel repoda geçersiz bir uzaktan başvurunuz olduğunda, ancak bu dalın uzak sunucuda artık bulunmadığı durumlar için geçerlidir. Sorunuzun yanıtı $ git push origin: whatever
jpswain

Evet, bir dalın silindiği uzak depoda bir şey olursa, ancak yerel makinenizdeki o uzak dala hala başvuruyorsanız, temizlemek için orijinal cevabımda koyduğum şeyi yapmanız gerekir.
jpswain

6
Büyük bir temizleme işiniz varsa (birçok sarkan uzaktan kumanda), tüm uzak dalları silebilirsiniz, git branch -rd $(git branch -r)daha sonra bir getirme yaparak geçerli olanları yeniden oluşturabilirsiniz.
nobar

Benim durumum, git config -euzaktan kumandayı yeniden adlandırmaya alışmış olmamdı. Uzaktan kumandayı yeniden adlandırıldı mineiçin origin. Sonra, bu benim için en iyi çözüm oldu:git branch -rd $(git branch -r | grep 'mine/')
Steven Lu

70

git gc --prune=now istediğin şey değil.

git remote prune public

veya git remote prune origin# bu uzak kaynaksa

ne istiyorsun


6
@Casey $ git gc #, git dosyalarının $ $ uzak uzak kök kaynağını hızlandırmak için git dosyalarının birleştirilmesini sever. # "Git branch -r | grep origin" ile gösterilen eski uzak dalları siler. Bu soruyu sorduğuma inanıyorum. Yani, komutlar tamamen farklı.
tongueroo

29

Ref doluyken kabul edilen cevap benim için işe yaramadı. Ancak bu:

$ git remote add public http://anything.com/bogus.git
$ git remote rm public

Benim için çalıştı. Düzenli git branch -d çalışmıyor, yanlışlıkla .git / config dosyasında oluşturulan "orijinal" adlı kökeni kaldırdığım için dalın mevcut olmadığı hatası döndürdü.
Haziran'da

Yanlışlıkla .git / config dosyamdan (ilgisiz bir yolsuzluk nedeniyle yeniden oluşturulması gerekiyordu) kaldırılan dalları kaldırmak için kullanmak zorunda olduğum yöntem budur. Bu cevap şu ana kadar zincirde çok kötü oldu, en sonunda çözümü buldum ve kabul edilen cevaba eklemek için gittim!
taranaki

Svn2git kullandıktan sonra ihtiyacım olan buydu. Çok sayıda uzaktan kumanda / svn / * şubesi vardı. Önce sahte bir 'svn' uzaktan oluşturmak zorunda kaldı.
Sam

7

Benim durumumda kaydedilmiş girişleri silmeye çalışıyordum .git/packed-refs. Bu düz metin dosyasını düzenleyebilir vegit br -D nasıl dokunacağını bilmeyen (En azından 1.7.9.5 sürümünde).

Bu çözümü burada buldum: https://stackoverflow.com/a/11050880/1695680


vay, bu bana yardımcı oldu. Meslektaşım denedi, VS'yi yeniden başlat, Bilgisayarını yeniden başlat hiçbir şey işe yaramadı, yerel deposunu sildi ve bundan kurtulmak için her şeyi çekti :)
Esen

1
Bugün, bu paketlenmiş refs dosyasının bir parçası olarak yaratıldığını git gc, taahhütlerinizi yüksek sıkıştırılmış bir arşive paketlediğinde , aynı zamanda referansları muhtemelen optimizasyon amacıyla tek bir düz metin dosyasına taşıdı; Umarım git gelecekteki sürümleri git br -D ...ref dolu olabilir .
ThorSummoner


3

Bilmiyordum git branch -rd, bu yüzden bu gibi sorunları kendim çözme yolum, repoma uzaktan bir repo olarak davranmak ve uzaktan silme yapmak. git push . :refs/remotes/public/master. Diğer yollar işe yaramazsa ve kurtulmak istediğiniz garip bir referansınız varsa, bu ham yol eminimdir. Her türlü referansı kaldırmak (veya oluşturmak!) İçin kesin hassasiyet sağlar.


2

Sadece biraz ilgili, ama yine de sahip olduğumuz aynı durumda yardımcı olabilir - uzak depomuz için bir ağ dosya paylaşımı kullanıyoruz. Geçen hafta işler çalışıyordu, bu hafta "Uzak kaynak, şube ref / başlıkları / master için Ref reklamını yapmadı. Bu Ref uzaktan kumandada olmayabilir veya izin ayarlarıyla gizlenmiş olabilir" hatasını alıyordu.

Ama biz şeyleri bozmak için hiçbir şey yapılmadığına inandık. NFS anlık görüntüler alıyor, bu yüzden her "önceki sürümü" inceledim ve üç gün önce deponun MB boyutunun 282 MB'tan 33 MB'a gittiğini gördüm ve yaklaşık 1.403 yeni dosya ve 300 klasör mevcuttu. İş arkadaşlarımı sorguladım ve biri o gün bir itme yapmaya çalıştı - sonra iptal etti.

NFS "Geri Yükle" işlevini o tarihten hemen önceki haline getirmek için kullandım ve şimdi her şey tekrar düzgün çalışıyor. Daha önce kuru erik denedin mi, yardımcı olmadı gibi görünüyor. Belki de daha sert temizlik işe yarardı.

Umarım bu bir gün başka birine yardımcı olabilir!

alakarga


2

Benzer bir sorun yaşadım. Cevapların hiçbiri işe yaramadı. Benim durumumda, kalıcı olarak gösterilen iki kaldırılmış uzak depo vardı.

Son fikrim, ona yapılan tüm referansları el ile kaldırmaktı.

Diyelim ki depoya “Repo” deniyor. Yaptım:

find .git -name Repo 

Bu nedenle, ilgili dosyaları ve dizinleri .git klasöründen sildim ( bu klasör Rails uygulamanızda veya bilgisayarınızda bulunabilir https://stackoverflow.com/a/19538763/6638513 ).

Sonra yaptım:

grep Repo -r .git

Bu, karşılık gelen satırları kaldırdığım bazı metin dosyaları buldu. Şimdi, her şey yolunda görünüyor.

Genellikle, bu işi git'e bırakmalısınız.

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.