git elimina telecomandi: i riferimenti remoti non esistono


107

In breve;

  • Come posso eliminare più telecomandi uniti?

Più background;

Ho un repository git con decine di telecomandi che sono stati uniti in master. Posso eliminare questi telecomandi uno alla volta utilizzando:

git push --delete origin myBranch-1234

Tuttavia questo è un processo lento e noioso per tutti i telecomandi. Quindi sto provando questo comando:

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

git branch -r --mergedelenca tutti i telecomandi uniti.
grep origindice al comando di includere origin.
grep -v masterdice al comando di escludere il master.
xargs git push origin --deletedice al comando di eliminare l'elenco dei telecomandi.

Tutti insieme, mi aspetto che questo raccolga tutti i telecomandi uniti e li elimini.

Quando eseguo il comando precedente, ricevo quanto segue per ogni telecomando unito;

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

Tuttavia questi telecomandi esistono e posso controllarli tutti. Molti siti e persone mi consigliano di correre git fetch --pruneper ripulire i riferimenti mancanti. Questo non fa nulla perché tutti questi telecomandi esistono.

Quindi ti chiedo, caro scambio di pile;

  • Perché posso eliminare un telecomando, ma non molti?
  • Il mio comando è corretto?

Penso che mi manchi qualcosa di piccolo. Ogni volta che cerco questo, sembra che lo sto facendo correttamente, ma ricevo gli errori di cui sopra.

Risposte:


226

Potrebbe essere necessario eliminare prima la "cache" locale dei rami remoti. Prova a correre:

git fetch -p origin

prima di eliminare.


2
Questo mi ha risolto, grazie! Tuttavia, perché non si aggiorna quando recupero senza --prune? A mio parere è piuttosto fuorviante
dave0688

6
Solo una nota per le persone che arrivano qui da una ricerca - anche se questo è chiaramente utile alla maggior parte di coloro che atterrano qui, non è effettivamente corretto in termini di problema originale - il problema dell'OP era che il suo comando era erroneamente incluso origin/nei nomi dei rami, come descritto / risolto in altre risposte.
CupawnTae

104

Quei rami vengono rimossi dal remoto (origine)? Se sì, puoi semplicemente farlo

git fetch --prune origin

Altrimenti potrebbero tornare anche dopo averli eliminati localmente.

Aggiornamento: guardando di nuovo il tuo comando, sembra che tu lo stia costruendo in modo errato. Probabilmente lo vuoi

git push origin --delete myBranch-1234

ma invece stai facendo qualcosa di simile

git push origin --delete origin/myBranch-1234

Nessuno dei rami viene rimosso in origine. Posso controllare qualcuno di loro.
Jqw

1
sì, perché nel secondo caso esegui comandi diversi.
Mykola Gurov

1
Non capisco il tuo punto. So che sto usando due diversi comandi. Il secondo caso è ottenere tutti i telecomandi uniti con git branch -r --mergede quindi sto cercando di eliminarli con xargs git push origin --delete. Il comando sta tentando di eliminare i telecomandi tranne per il fatto che pensa che il file remote ref does not exist.
Jqw

1
nel secondo comando in pipe, metti echo accanto a xargsper vedere cosa viene effettivamente eseguito.
Mykola Gurov

2
@Jqw Non puoi includere il origin/prefisso nel nome del ramo, git sa già che stai lavorando con i rami di origin da quando sei in esecuzione git push origin. Il suggerimento di Mykola era di fare l'ultima parte del comando xargs echo, piuttosto che echo xargs [...].
Matthew Read il

15

Utilizzare sedper rimuovere la parte "origin /" e modificare una xargsparte lttile .

git branch -r --merged | grep origin | grep -v -e master | sed s/origin\\/// |  xargs -I{} git push origin --delete {}
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.