git delete remotes: zdalne referencje nie istnieją

107

W skrócie;

  • Jak mogę usunąć zdalne wiele połączonych pilotów?

Więcej informacji;

Mam repozytorium git z dziesiątkami pilotów, które zostały połączone w master. Mogę usuwać te piloty pojedynczo, używając:

git push --delete origin myBranch-1234

Jednak jest to powolny i żmudny proces dla wszystkich pilotów. Więc próbuję tego polecenia:

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

git branch -r --mergedwyświetla listę wszystkich połączonych pilotów.
grep origininformuje polecenie, aby zawierało źródło.
grep -v masterinformuje polecenie, aby wykluczyć wzorzec.
xargs git push origin --deleteinformuje polecenie, aby usunąć listę pilotów.

Oczekuję, że wszystko razem zgromadzi wszystkie scalone piloty i je usunie.

Kiedy uruchamiam powyższe polecenie, otrzymuję następujące informacje dla każdego połączonego pilota;

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

Jednak te piloty istnieją i mogę sprawdzić każdy z nich. Wiele witryn i osób poleca mi bieganie w git fetch --prunecelu usunięcia brakujących odniesień. To nic nie robi, ponieważ wszystkie te piloty istnieją.

Więc proszę cię, droga giełdzie stosów;

  • Dlaczego mogę usunąć jednego pilota, ale nie wielu?
  • Czy moje polecenie jest poprawne?

Myślę, że brakuje mi czegoś małego. Za każdym razem, gdy to badam, wydaje się, że robię to poprawnie, ale otrzymuję powyższe błędy.

Jqw
źródło

Odpowiedzi:

226

Być może będziesz musiał najpierw wyczyścić lokalną "pamięć podręczną" zdalnych oddziałów. Spróbuj biegać:

git fetch -p origin

przed usunięciem.

Igor
źródło
2
To dla mnie rozwiązało problem, dzięki! Jednak dlaczego nie aktualizuje się, gdy pobieram bez --prune? Moim zdaniem to dość mylące
dave0688
6
Tylko uwaga dla osób przybywających tutaj z wyszukiwania - chociaż jest to wyraźnie przydatne dla większości, którzy tu lądują, w rzeczywistości nie jest poprawne w odniesieniu do pierwotnego problemu - problem OP polegał na tym, że jego polecenie nieprawidłowo zostało uwzględnione origin/w nazwach oddziałów, zgodnie z opisem / rozwiązano w innych odpowiedziach.
CupawnTae
104

Czy te gałęzie są usunięte z odległego (pochodzenia)? Jeśli tak, możesz to po prostu zrobić

git fetch --prune origin

W przeciwnym razie mogą powrócić nawet po ich lokalnym usunięciu.

Aktualizacja: Patrząc ponownie na twoje polecenie, wygląda na to, że tworzysz je nieprawidłowo. Prawdopodobnie chcesz

git push origin --delete myBranch-1234

ale zamiast tego robisz coś takiego

git push origin --delete origin/myBranch-1234
Mykoła Gurow
źródło
Żadna z gałęzi nie jest usuwana pierwotnie. Mogę sprawdzić którekolwiek z nich.
Jqw
1
tak, ponieważ w drugim przypadku wykonujesz różne polecenia.
Mykola Gurov
1
Nie rozumiem twojego punktu. Wiem, że używam dwóch różnych poleceń. Drugi przypadek to pobranie wszystkich połączonych pilotów z, git branch -r --mergeda następnie próbuję je usunąć za pomocą xargs git push origin --delete. Polecenie próbuje usunąć piloty, z wyjątkiem tego, że uważa, że remote ref does not exist.
Jqw
1
w drugim, potokowym poleceniu, umieść echo tuż obok, xargsaby zobaczyć, co jest faktycznie wykonywane.
Mykola Gurov
2
@Jqw Nie możesz dołączyć origin/prefiksu do nazwy gałęzi, git już wie, że pracujesz z gałęziami pochodzenia, odkąd jesteś uruchomiony git push origin. Mykoła zaproponował xargs echoraczej ostatnią część polecenia niż echo xargs [...].
Matthew Przeczytaj
15

Służy seddo usuwania części „pochodzenia /” i zmiany xargsczęści lttile .

git branch -r --merged | grep origin | grep -v -e master | sed s/origin\\/// |  xargs -I{} git push origin --delete {}
kost
źródło