Quando si elimina il ramo git remoto "errore: impossibile spingere verso destinazione non qualificata"


139

Sto cercando di eliminare un ramo git remoto con

git push origin :my_remote_branch

e ottenere:

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'

questi sono i miei rami attuali

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

Qualche idea su come sbarazzarsi di questo ramo sarebbe apprezzata.


Hai provato git fetcha vedere se è stato corretto quel nome remoto inesistente? Hai provato ad andare nel tuo .git\refs\remotes\origined eliminare il my_remote_branchfile, per vedere se è abbastanza?
VonC,

ha fatto git fetchma che non ha aiutato. Proverà a cercare una soluzione più semplice prima di provare a eliminare il file manualmente.
Hugo,

prova a cancellare o almeno spostare quel file: contiene solo l'SHA1 della punta di quel ramo.
VonC,

45
Devi fare git fetch -pper sbarazzarti dei rami di localizzazione non aggiornati.
Jan Hudec,

Risposte:


270

Il fatto che refs/remotes/origin/my_remote_branchesiste nel repository locale non implica che refs/heads/my_remote_branchesista nel originrepository remoto.

Fare git fetch -p originper refs/remotes/origin/my_remote_branchandare via se è già stato eliminato in origine. L' -popzione indica a fetch di eliminare tutti i rami di tracciamento che non esistono più nei telecomandi corrispondenti; di default sono tenuti in giro.


12
git fetch -p originriparato per me. Grazie mille.
redimp

1
La tua risposta è fantastica Breve e sull'essenza!
1stinto

la potatura non ha aiutato! mentre git push origin --delete origin/feature/xmi dava un errore riguardo all'inesistenza ref git push origin :feature/xha cancellato il ramo. Quindi suppongo git push origin --delete <branchName>che non dovrebbe includere l'origine in branchName (?) Ma è bash-completato che è confuso.
dashesy,

@dashesy, eri in una situazione diversa rispetto al richiedente originale. Nella domanda originale, il problema è che il ramo remoto era già stato eliminato , presumibilmente da qualcun altro, quindi solo il locale doveva essere sincronizzato. Durante l'eliminazione del telecomando. In effetti, il comando dovrebbe essere git push origin --delete feature/x, perché si sta dando il nome del ramo in origine , e non ha quel prefisso lì (le due forme sono comunque sinonimi).
Jan Hudec,

@JanHudec ha un senso. Bash complete è intelligente quando si usa :per non includere originma si completa come origin/branch_nameinvece che semplicemente branch_namequando si usa la --deletevariante.
dashesy,

56

Ho trovato una domanda per ripulire i vecchi rami remoti e questo ha funzionato

git branch -r -d origin/my_remote_branch

Ho provato a fare esattamente questo per circa un'ora, grazie mille!
sebkkom,

Ciò non elimina il ramo remoto. Se vai a prendere un git vedrai di nuovo il ramo. Lo rimuove semplicemente dall'elenco locale della filiale remota.
Patrick Desjardins,

2
@PatrickDesjardins git push origin :my_remote_branchelimina esattamente il ramo dal telecomando e lo git branch -r -d origin/my_remote_branchrimuove dal mio elenco locale di rami remoti
Hugo,

11

Mi sono imbattuto in questo durante il tentativo di eliminare un ramo remoto che era già stato eliminato. Tutto ciò che serviva era una prugna:

git remote prune origin

4

Prova a seguire due opzioni per eliminare forzatamente il ramo remoto

opzione 1

get push origin --delete <branchName>

opzione 2

git fetch -p origin
git branch -r -d origin/<branchName>

3
git branch -r -d origin/my_remote_branch

non era abbastanza per me. Prima dovevo andare sul server e lavorare direttamente con la directory git (che è pericolosa e brutta) per rimuovere il ramo:

ssh mygitserver
su - git
cd /home/git/repositories/my_remote_branch.git/
git  --git-dir=. --work-tree=/tmp/ branch -D my_remote_branch

Non è solo pericoloso e brutto, è anche sbagliato . Per prima cosa, questa domanda riguarda l'eliminazione locale del ramo quando è stato eliminato in remoto. E per l'altro, eliminare un ramo da remoto è solo una questione di git push origin :my_remote_branch. Attenzione ai due punti.
Jan Hudec,

Hai ragione Jan, git push origin :my_remote_branchè normale. Questo brutto e pericoloso modo è quando questo non funziona (ad esempio a causa di git configurato male).
pevik,

1

Ho il problema simile Per prima cosa sono andato a questa discussione, tuttavia non sono riuscito a risolvere il problema finché non ho visto https://stackoverflow.com/a/32147743/4209849 .

che semplicemente aggiunge un suggerimento su distinguendo origin/my-branch-namee my-branch-name.

Per essere specifici, dovrei usare:

git push origin :my_remote_branch

invece di

git push origin :origin/my_remote_branch

Questo almeno ha risolto il mio problema, spero che possa aiutare anche gli altri.


1

Per me il problema era che questo era il mio ramo predefinito su Github. Ho cambiato il ramo predefinito, quindi l'operazione di eliminazione è riuscita.

Spero che aiuti a qualcuno


0

Ho avuto lo stesso problema, ho modificato manualmente il mio ./.git/configfile per includere:

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

Il risultato è stato: error: src refspec branchName matches more than one.risolto correndo $git tag -d branchName. Dopo di che sono stato in grado di spingere il nuovo ramo a monte.


0

Questo ha funzionato per me: ho creato il ramo remoto sull'interfaccia utente di github e quindi ho spinto il mio ramo locale che aveva lo stesso nome. Provalo nel caso in cui altri modi non funzionino. Un altro modo sarebbe creare un nuovo ramo localmente e spingere un ramo vuoto e successivamente selezionare il commit e spingere di nuovo sul telecomando.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.