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 'git@example.com:/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.


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.


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

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

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>

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

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.


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


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.