Podczas usuwania zdalnej gałęzi git „błąd: nie można wypchnąć do niekwalifikowanego miejsca docelowego”

139

Próbuję usunąć zdalną gałąź git za pomocą

git push origin :my_remote_branch

i otrzymuję:

error: unable to push to unqualified destination: my_remote_branch
The destination refspec neither matches an existing ref on the remote nor
begins with refs/, and we are unable to guess a prefix based on the source ref.
error: failed to push some refs to '[email protected]:/myrepo'

to są moje obecne gałęzie

git branch -a
* develop
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/my_remote_branch

git branch -r --merged
  origin/HEAD -> origin/master
  origin/develop
  origin/master

Wszelkie pomysły, jak pozbyć się tej gałęzi będą mile widziane.

Hugo
źródło
Czy próbowałeś git fetchsprawdzić, czy naprawił tę nieistniejącą zdalną nazwę? Czy próbowałeś wejść do swojego .git\refs\remotes\origini usunąć my_remote_branchplik, aby sprawdzić, czy to wystarczy?
VonC,
tak git fetch, ale to nie pomogło. Spróbuje poszukać prostszego rozwiązania przed próbą ręcznego usunięcia pliku.
Hugo,
spróbuj usunąć lub przynajmniej przenieść ten plik: zawiera tylko SHA1 końcówki tej gałęzi.
VonC
45
Musisz zrobić, git fetch -paby pozbyć się przestarzałych gałęzi śledzących.
Jan Hudec

Odpowiedzi:

270

Fakt, że refs/remotes/origin/my_remote_branchistnieje w lokalnym repozytorium, nie oznacza, że refs/heads/my_remote_branchistnieje w originzdalnym repozytorium.

Zrób, git fetch -p originaby refs/remotes/origin/my_remote_branchodejść, jeśli jest już usunięty w źródle. Ta -popcja nakazuje funkcji pobierania, aby usunąć wszystkie gałęzie śledzenia, które już nie istnieją w odpowiednich pilotach; domyślnie są trzymane w pobliżu.

Jan Hudec
źródło
12
git fetch -p originnaprawiłem to dla mnie. Wielkie dzięki.
redimp
1
Twoja odpowiedź jest niesamowita. Krótko i o istocie!
1nstinct
przycinanie nie pomogło! podczas gdy git push origin --delete origin/feature/xdał mi błąd o nieistnieniu, ref git push origin :feature/xusunął gałąź. Więc myślę, że git push origin --delete <branchName>nie powinienem uwzględniać pochodzenia w branchName (?), Ale jest to zakończone bash, co jest mylące.
przerywany
@dashy, byłeś w innej sytuacji niż pierwotny pytający. W pierwotnym pytaniu problem polega na tym, że zdalna gałąź została już usunięta , prawdopodobnie przez kogoś innego, więc tylko lokalna musiała zostać zsynchronizowana. Podczas usuwania pilota. Rzeczywiście, polecenie powinno być git push origin --delete feature/x, ponieważ podajesz nazwę gałęzi w miejscu pochodzenia i nie ma tam tego przedrostka (poza tym te dwie formy są synonimami).
Jan Hudec
@JanHudec ma sens. Bash complete jest sprytny, gdy używa się go, :aby nie uwzględniać, originale kończy, origin/branch_namezamiast po prostu, branch_namegdy używa się --deletewariantu.
kreska
56

Znaleziono pytanie dotyczące czyszczenia starych zdalnych gałęzi git i to załatwiło sprawę

git branch -r -d origin/my_remote_branch
Hugo
źródło
Próbuję to zrobić już od około godziny, wielkie dzięki!
sebkkom
Nie powoduje to usunięcia zdalnej gałęzi. Jeśli pójdziesz na git fetch, zobaczysz gałąź ponownie. Po prostu usuwa go z lokalnej listy zdalnego oddziału.
Patrick Desjardins
2
@PatrickDesjardins dokładnie git push origin :my_remote_branchusuwa oddział ze zdalnego i git branch -r -d origin/my_remote_branchusuwa go z mojej lokalnej listy zdalnych oddziałów
Hugo
11

Natknąłem się na to, próbując usunąć zdalną gałąź, która została już usunięta. Potrzebna była tylko śliwka:

git remote prune origin
Mateusz
źródło
4

Spróbuj zastosować dwie opcje, aby wymusić usunięcie zdalnego oddziału

opcja 1

get push origin --delete <branchName>

Opcja 2

git fetch -p origin
git branch -r -d origin/<branchName>
Pawan Maheshwari
źródło
3
git branch -r -d origin/my_remote_branch

mi nie wystarczało. Zanim musiałem udać się na serwer i bezpośrednio pracować z katalogiem git (co jest niebezpieczne i brzydkie), aby usunąć gałąź:

ssh mygitserver
su - git
cd /home/git/repositories/my_remote_branch.git/
git  --git-dir=. --work-tree=/tmp/ branch -D my_remote_branch
pevik
źródło
To nie tylko niebezpieczne i brzydkie, ale także złe . Po pierwsze, to pytanie dotyczy usuwania lokalnego oddziału, gdy został on usunięty zdalnie. Z drugiej strony usunięcie oddziału ze zdalnego jest tylko kwestią git push origin :my_remote_branch. Uważaj na okrężnicę.
Jan Hudec,
Masz rację Jan, git push origin :my_remote_branchto normalny sposób. Ten brzydki i niebezpieczny sposób jest wtedy, gdy to nie działa (np. Z powodu źle skonfigurowanego gita).
pevik
1

Mam podobny problem. Najpierw poszedłem do tej dyskusji, jednak nie mogłem rozwiązać problemu, dopóki nie zobaczyłem https://stackoverflow.com/a/32147743/4209849 .

które po prostu dodają wskazówkę dotyczącą rozróżniania origin/my-branch-namei my-branch-name.

Aby być konkretnym, powinienem użyć:

git push origin :my_remote_branch

zamiast

git push origin :origin/my_remote_branch

To przynajmniej rozwiązało mój problem, mam nadzieję, że pomoże to również innym.

Kangqiao Zhao
źródło
1

Dla mnie problem polegał na tym, że to była moja domyślna gałąź na githubie. Zmieniłem domyślną gałąź, a następnie operacja usunięcia powiodła się.

Mam nadzieję, że to komuś pomoże

Vlad Pulichev
źródło
0

Mając ten sam problem, ręcznie zmodyfikowałem ./.git/configplik, aby zawierał:

[branch "branchName"]
remote = origin
merge = refs/heads/branchName

Co zaowocowało: error: src refspec branchName matches more than one.Naprawiłem to, uruchamiając $git tag -d branchName. Po czym mogłem wypchnąć nową gałąź na wyższy poziom.

Kaweesi Joseph
źródło
0

To zadziałało dla mnie: utworzyłem zdalną gałąź w interfejsie użytkownika github, a następnie wypchnąłem mój lokalny oddział, który miał tę samą nazwę. Wypróbuj, jeśli inne sposoby nie działają. Innym sposobem byłoby utworzenie nowej gałęzi lokalnie i wypchnięcie pustej gałęzi, a następnie wybranie najlepszego zatwierdzenia i ponowne wysłanie do pilota.

Nutan
źródło