Supprimer toutes les balises d'un référentiel Git

224

Je souhaite supprimer toutes les balises d'un référentiel Git. Comment puis je faire ça?

En utilisant git tag -d tagnamesupprimer la balise tagnamelocalement, et en utilisant git push --tagsje mets à jour les balises sur le fournisseur git.

J'ai essayé:

git tag -d *

Mais je vois que cela *signifie les fichiers du répertoire actuel.

$ git tag -d *
error: tag 'file1' not found.
error: tag 'file2' not found.
...

Considérez que j'ai beaucoup de balises et que je veux les supprimer toutes.

Ionică Bizău
la source

Réponses:

419
git tag | xargs git tag -d

Utilisez simplement la philosophie Linux où vous canalisez tout. Sous Windows, utilisez git bash avec la même commande.

Florian Margaine
la source
136
Merci. Cette commande supprime les balises locales. Je les git tag -l | xargs -n 1 git push --delete originsupprimais de la télécommande.
Ionică Bizău
7
Et sous Windows?
CodeManX
7
@CoDEmanX Sous Windows, vous devez utiliser git bash avec la même commande.
inf3rno
2
Ne supprime pas les balises distantes, également très lent pour des milliers de balises.
Adrian Baker
1
'xargs' n'est pas reconnu comme une commande interne ou externe sur Windows 10
Gulzar
207

Pour supprimer des balises distantes (avant de supprimer des balises locales), procédez simplement comme suit:

git tag -l | xargs -n 1 git push --delete origin

puis supprimez les copies locales:

git tag | xargs git tag -d
karlingen
la source
La suppression à distance est beaucoup trop lente pour des dizaines de balises.
ffxsam
5
Cette réponse est beaucoup plus rapide si vous avez beaucoup de balises distantes: stackoverflow.com/a/34395864/747044
adriaan
L'ordre des commandes dans cette réponse suppose qu'il n'y a pas de balises locales uniquement.
Acumenus
C'est trop lent, la solution ci-dessous est meilleure.
Root Fool
Si vous devez saisir une phrase secrète pour les validations, cela nécessite une phrase secrète pour chaque balise. L'autre solution est meilleure.
kap
56

Il peut être plus efficace de pousser la suppression de toutes les balises dans une seule commande. Surtout si vous en avez plusieurs centaines.

Dans un shell non Windows approprié, supprimez toutes les balises distantes:

git tag | xargs -L 1 | xargs git push origin --delete

Supprimez ensuite toutes les balises locales:

git tag | xargs -L 1 | xargs git tag --delete

Cela devrait être OK tant que vous n'avez pas de nom 'dans votre balise. Pour cela, les commandes suivantes doivent être OK.

git tag | xargs -I{} echo '"{}"' | tr \\n \\0 | xargs --null git push origin --delete
git tag | xargs -I{} echo '"{}"' | tr \\n \\0 | xargs --null git tag --delete

Il existe probablement d'autres façons de prendre une liste de lignes, de les mettre entre guillemets, de les transformer en une seule ligne, puis de passer cette ligne à une commande. Considérant que c'est l'environnement de dépouillement de chat ultime et tout.

Richard A Quadling
la source
3
J'avais plusieurs milliers de balises, les supprimer un par un d'un dépôt cloud distant prenait des jours, ce qui a résolu.
Adrian Baker
Que fait- xargs -L 1il?
ymett
-L max-lines --max-lines [= max-lines] -l [max-lines] Utilisez au maximum max-lines des lignes d'entrée non vides par ligne de commande. Pour '-l', max-lines vaut par défaut 1 si omis. Pour '-L', l'argument est obligatoire. Les blancs à la fin entraînent la poursuite logique d'une ligne d'entrée sur la ligne d'entrée suivante, dans le but de compter les lignes. Implique «-x». La forme «-l» de cette option est déconseillée au profit de l'option «-L» compatible POSIX. gnu.org/software/findutils/manual/html_node/find_html/…
Richard A Quadling
@RichardAQuadling D'accord, mais quel effet cela at-il dans la réponse? git tagrenvoie les balises, une par ligne, puis les xargs -L 1affiche une par ligne, alors à quoi ça sert?
ymett
Hmmm. Apparemment rien dans ce contexte! Autre que de ralentir les choses!
Richard A Quadling
24

Pour les utilisateurs de Windows utilisant PowerShell:

git tag | foreach-object -process { git tag -d $_ }

Cela supprime toutes les balises retournées par git tagen exécutant git tag -dpour chaque ligne retournée.

Stefan Domnanovits
la source
23

Ajout à la réponse de Stefan qui manquait comment supprimer les balises de la télécommande. Pour Windows PowerShell, vous pouvez l'exécuter pour supprimer d'abord les balises distantes suivies des balises locales.

git tag | foreach-object -process { git push origin --delete $_ }
git tag | foreach-object -process { git tag -d $_ }  
Yong Choi
la source
19

Si vous n'avez pas les balises dans votre référentiel local, vous pouvez supprimer les balises distantes sans avoir à les apporter à votre référentiel local.

git ls-remote --tags --refs origin | cut -f2 | xargs git push origin --delete

N'oubliez pas de remplacer "origine" par le nom de votre gestionnaire distant.

Valtoni Boaventura
la source
Excellent! Cela les a tous supprimés en une seule fois. L'autre commande en supprimait une toutes les 2 secondes
fregante
6

Vous pouvez aussi utiliser:

git tag -d $(git tag)
ViZeke
la source
cela ne fonctionnera pas si vous avez beaucoup de balises, comme des milliers
DixonD
dans ce cas, vous pouvez utiliser quelque chose comme: git tag -d $ (git tag | head -n 999) et l'exécuter x fois
ViZeke
1

Étant donné que toutes ces options ne fonctionnent que sous Linux, voici l'équivalent de Windows pour quiconque doit y faire face:

FOR /F usebackq %t IN (`git tag`) DO @git tag --delete %t
DarkWiiPlayer
la source
1

Je dois supprimer les tags avec préfixe

par exemple, je dois supprimer les balises v0.0.1, v0.0.2, v0.0.3, v0.0.4, v0.0.5

git tag -d $(git tag -l "v0.0.*")

Pour répertorier toutes les balises avec préfixe

git tag -l "v0.0.*"

Pour supprimer les balises

git tag -d $tag_names

Voilà comment fonctionne la première déclaration

Brady Huang
la source
Rapide, simple et efficace. A travaillé, merci!
Vedran Mandić
0

Powershell v7 prend en charge foreach parallèle si vous avez beaucoup de balises en amont (origine) que vous devez supprimer:

git tag | foreach-object -Parallel { 
git push origin --delete $_ 
git tag -d $_ 
}
Peter Rekdal Sunde
la source