git delete télécommandes: les références distantes n'existent pas

107

En bref;

  • Comment puis-je supprimer plusieurs télécommandes fusionnées à distance?

Plus de fond;

J'ai un git repo avec des dizaines de télécommandes qui ont été fusionnées dans master. Je peux supprimer ces télécommandes une par une en utilisant:

git push --delete origin myBranch-1234

Cependant, il s'agit d'un processus lent et fastidieux pour toutes les télécommandes. J'essaye donc cette commande:

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

git branch -r --mergedrépertorie toutes les télécommandes fusionnées.
grep originindique à la commande d'inclure l'origine.
grep -v masterindique à la commande d'exclure le maître.
xargs git push origin --deleteindique à la commande de supprimer la liste des télécommandes.

Dans l'ensemble, je m'attends à ce que cela rassemble toutes les télécommandes fusionnées et les supprime.

Lorsque j'exécute la commande ci-dessus, je reçois ce qui suit pour chaque télécommande fusionnée;

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

Cependant, ces télécommandes existent et je peux vérifier chacune d'elles. De nombreux sites et personnes recommandent que je cours git fetch --prunepour nettoyer les références manquantes. Cela ne fait rien car toutes ces télécommandes existent.

Alors je vous demande, cher échange de pile;

  • Pourquoi puis-je supprimer une télécommande, mais pas plusieurs?
  • Ma commande est-elle correcte?

Je pense qu'il me manque quelque chose de petit. Chaque fois que je recherche cela, il semble que je le fais correctement, mais j'obtiens les erreurs ci-dessus.

Jqw
la source

Réponses:

226

Vous devrez peut-être d'abord élaguer votre "cache" local de branches distantes. Essayez de courir:

git fetch -p origin

avant de supprimer.

Igor
la source
2
Cela a résolu le problème pour moi, merci! Cependant, pourquoi ne se met-il pas à jour lorsque je récupère sans --prune? À mon avis, c'est assez trompeur
dave0688
6
Juste une note pour les personnes arrivant ici après une recherche - bien que cela soit clairement utile à la majorité qui atterrit ici, ce n'est pas vraiment correct en ce qui concerne le problème d'origine - le problème du PO était que sa commande était incorrectement incluse origin/dans les noms des succursales, comme décrit / résolu dans d'autres réponses.
CupawnTae
104

Ces branches sont-elles supprimées de la télécommande (origine)? Si oui, vous pouvez simplement faire

git fetch --prune origin

Sinon, ils pourraient revenir même après les avoir supprimés localement.

Mise à jour: en regardant à nouveau votre commande, il semble que vous ne la construisiez pas correctement. Tu veux probablement

git push origin --delete myBranch-1234

mais à la place, vous faites quelque chose comme

git push origin --delete origin/myBranch-1234
Mykola Gurov
la source
Aucune des branches n'est supprimée à l'origine. Je peux vérifier n'importe lequel d'entre eux.
Jqw
1
oui, car vous exécutez différentes commandes dans le second cas.
Mykola Gurov
1
Je ne comprends pas votre point. Je sais que j'utilise deux commandes différentes. Le deuxième cas est d'obtenir toutes les télécommandes fusionnées avec git branch -r --merged, puis j'essaye de les supprimer avec xargs git push origin --delete. La commande tente de supprimer les télécommandes, sauf qu'elle pense que le remote ref does not exist.
Jqw
1
dans votre deuxième commande, mettez echo juste à côté de xargspour voir ce qui est réellement exécuté.
Mykola Gurov
2
@Jqw Vous ne pouvez pas inclure le origin/préfixe sur le nom de la branche, git sait déjà que vous travaillez avec les branches d'origine depuis que vous exécutez git push origin. La suggestion de Mykola était de faire la dernière partie de la commande xargs echo, plutôt que echo xargs [...].
Matthew Lire
15

Utilisez sedpour supprimer la partie 'origine /' et modifier une xargspartie lttile .

git branch -r --merged | grep origin | grep -v -e master | sed s/origin\\/// |  xargs -I{} git push origin --delete {}
kost
la source