Comment supprimer une balise distante git?

Comment supprimer une étiquette git qui a déjà été poussée?

2247
demandé sur markdorison 2011-03-30 03:41:56
la source

18 ответов

vous avez juste besoin de pousser une référence "vide" au nom de la balise distante:

git push origin :tagname

ou, plus explicitement, utilisez l'option --delete (ou -d si votre version git est plus ancienne que 1.8.0):

git push --delete origin tagname

si vous devez également supprimer l'étiquette locale, utilisez:

git tag --delete tagname

arrière-plan

pousser une branche, une étiquette ou un autre ref vers une télécommande référentiel implique de spécifier "push où, de quelle source, de la destination?"

git push where-to-push source-ref:destination-ref

un exemple du monde réel où vous poussez votre branche principale à la branche principale de l'origine est:

git push origin refs/heads/master:refs/heads/master

qui, en raison des chemins par défaut, peut être raccourci à:

git push origin master:master

les Tags fonctionnent de la même manière:

git push origin refs/tags/release-1.0:refs/tags/release-1.0

qui peut aussi être raccourci à:

git push origin release-1.0:release-1.0

par en omettant le ref source (la partie avant le colon), vous poussez "rien" à la destination, en supprimant le ref sur la fin distante.

3728
répondu Adam Franco 2017-09-30 06:52:52
la source

une façon plus directe est

git push --delete origin YOUR_TAG_NAME

OMI préfixant du côlon syntaxe est un peu étrange dans cette situation

259
répondu quexer 2015-05-05 13:30:55
la source

si vous avez une balise distante v0.1.0 à supprimer, et votre télécommande est origin , alors simplement:

git push origin :refs/tags/v0.1.0

si vous devez également supprimer la balise localement:

git tag -d v0.1.0

Voir Adam Franco 's réponse pour une explication de Git est inhabituel : la syntaxe pour la suppression.

141
répondu Alex Dean 2018-05-03 22:03:23
la source

supprimer toutes les balises locales et obtenir la liste des balises distantes :

git tag -l | xargs git tag -d
git fetch

supprimer toutes les étiquettes à distance

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

nettoyer les étiquettes locales

git tag -l | xargs git tag -d
76
répondu Siddhartha Mukherjee 2016-06-20 21:29:51
la source

pour supprimer la balise du dépôt distant:

git push --delete origin TAGNAME

vous pouvez également supprimer l'étiquette localement:

git tag -d TAGNAME
27
répondu Andrea 2014-09-04 14:30:51
la source

de votre terminal, faites ceci:

git fetch
git tags
git tag -d {tag-name}
git push origin :refs/tags/{tag-name}

maintenant, allez à Github.com et rafraîchir, ils disparaissent.

18
répondu Mahmoud Zalt 2017-01-04 20:00:16
la source

notez juste que, si vous avez une branche distante nommée comme une balise distante, ces commandes sont ambiguës:

git push origin :tagname
git push --delete origin tagname

vous devez donc utiliser cette commande pour supprimer la balise:

git push origin :refs/tags/<tag>

et celui-ci pour supprimer la branche:

git push origin :refs/heads/<branch>

sinon, vous obtiendriez une erreur comme celle-ci:

error: dst refspec <tagname> matches more than one.
error: failed to push some refs to '<repo>'
14
répondu Alex Vazquez Fente 2016-05-27 13:37:51
la source

si vous avez créé une balise appelée release01 dans un dépôt Git, vous la retirerez de votre dépôt en faisant ce qui suit:

git tag -d release01 
git push origin :refs/tags/release01 

pour en retirer un d'un dépôt mercuriel:

hg tag --remove featurefoo

indiquer la référence https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551

9
répondu MeganZhou 2016-05-27 13:38:45
la source

Supprimer l'étiquette locale '12345'

git tag -d 12345

supprimer la balise distante '12345' (eg; GitHub version too)

git push origin :refs/tags/12345

autre approche

git push --delete origin tagName
git tag -d tagName

enter image description here

6
répondu Lyes CHIOUKH 2018-05-02 16:12:31
la source

L'autre répond point comment accomplir cela, mais vous devez garder à l'esprit les conséquences, puisque c'est un dépôt distant.

la page de manuel git tag, dans la section sur Retagging , a une bonne explication sur la façon d'informer avec courtoisie les autres utilisateurs de la prise en compte à distance du changement. Ils donnent même un modèle d'annonce pratique pour communiquer comment les autres devraient obtenir vos changements.

5
répondu Richard Venable 2013-03-04 21:04:01
la source

Jusqu'à 100x méthode plus rapide pour des milliers d'étiquettes à distance

après avoir lu ces réponses tout en ayant besoin de supprimer plus de 11 000 étiquettes, j'ai appris que ces méthodes de calcul ou xargs prennent beaucoup trop de temps, à moins que vous ayez des heures à brûler.

luttant, j'ai trouvé deux beaucoup voies plus rapides. Pour les deux, commencez par git tag ou git ls-remote --tags pour faire une liste des tags que vous voulez supprimer sur la télécommande. Dans les exemples ci-dessous, vous pouvez omettre ou remplacer sorting_proccessing_etc par grep ing, sort ing, tail ing ou head ing que vous voulez ( e.g. "1519250920 grep -P "my_regex" | sort | head -n -200 1519240920" etc ):


cette première méthode est de loin la plus rapide, peut-être 20 à 100 fois plus rapide que l'utilisation de xargs , et fonctionne avec au moins plusieurs mille étiquettes à la fois.

git push origin $(< git tag | sorting_processing_etc \
| sed -e 's/^/:/' | paste -sd " ") #note exclude "<" for zsh

Comment cela fonctionne? La liste normale des étiquettes séparées par des lignes est convertie en une seule ligne d'étiquettes séparées par de l'espace, chacune étant préprogrammée avec : so . . .

tag1   becomes
tag2   ======>  :tag1 :tag2 :tag3
tag3

utilisant git push avec cette étiquette de format pousse rien dans chaque ref à distance, l'effaçant (le format normal pour pousser de cette façon est local_ref_path:remote_ref_path ).

la deuxième méthode est présentée comme une réponse distincte ailleurs sur cette même page


après ces deux méthodes, vous voudrez probablement supprimer vos étiquettes locales aussi. C'est beaucoup plus rapide donc nous pouvons revenir à l'utilisation de xargs et git tag -d , ce qui est suffisant.

git tag | sorting_processing_etc | xargs -L 1 git tag -d

OU similaire à la télécommande supprimer:

git tag -d $(< git tag | sorting_processing_etc | paste -sd " ")
5
répondu TonyH 2017-09-08 00:18:25
la source

j'ai voulu supprimer toutes les étiquettes sauf celles qui correspondent à un motif pour que je puisse supprimer toutes les étiquettes sauf les deux derniers mois de production, voici ce que j'ai utilisé pour un grand succès:

Supprimer Toutes Les Étiquettes Distantes Et Exclure L'Expression Supprimer

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs -n 1 git push --delete origin

Supprimer Toutes Les Étiquettes Locales Et Exclure L'Expression Supprimer

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs git tag -d
5
répondu Lucent Fox 2017-09-26 02:11:03
la source

simple script pour supprimer l'étiquette donnée à la fois des emplacements locaux et d'origine. Avec une vérification si tag existe vraiment.

if [ $(git tag -l "") ]; then
    git tag --delete  
    git push --delete origin 

    echo done.
else
    echo tag named "" was not found
fi

comment utiliser:

  • Créer un fichier script shell (par ex. git-tag-purge.sh) et de coller le contenu.
  • chmod votre fichier de script pour le rendre exécutable.
  • Rendre le script disponible dans le monde entier
  • cd de votre projet git
  • Appel
  • script (par exemple,
    $>git-tag-purge.sh tag_name
    )
4
répondu Dimitar Vlasev 2017-04-25 15:07:52
la source

semble être beaucoup de travail pour quelque chose que xargs fait déjà. En regardant en arrière à travers ce fil, je devine la lenteur avec xargs que vous avez éprouvé est parce que la réponse originale utilisé xargs -n 1 quand il n'avait pas vraiment besoin.

c'est équivalent à votre méthode un sauf que xargs traite automatiquement de la longueur maximale de ligne de commande:

git tag | sorting_processing_etc | xargs git push --delete origin

xargs peut exécuter des processus en parallèle trop. Méthode 2 avec xargs :

git tag | sorting_processing_etc | xargs -P 5 -n 100 git push --delete origin

ce qui précède utilise un maximum de 5 processus pour traiter un maximum de 100 arguments dans chaque processus. Vous pouvez expérimenter avec les arguments pour trouver ce qui fonctionne le mieux pour vos besoins.

3
répondu HomerM 2017-06-05 18:21:38
la source

comme @CubanX l'a suggéré, j'ai divisé cette réponse de mon original:

Voici une méthode qui est plusieurs fois plus rapide que xargs et peut se dimensionner beaucoup plus avec des retouches. Il utilise le API Github , un jeton d'accès personnel, et exploite l'utilité parallel .

git tag | sorting_processing_etc | parallel --jobs 2 curl -i -X DELETE \ 
https://api.github.com/repos/My_Account/my_repo/git/refs/tags/{} -H 
\"authorization: token GIT_OAUTH_OR_PERSONAL_KEY_HERE\"  \
-H \"cache-control: no-cache\"`

parallel a de nombreux modes de fonctionnement, mais commande vous donner tout en vous permettant de définir des limites sur le nombre de processus. Vous pouvez modifier le paramètre --jobs 2 pour permettre une opération plus rapide, mais j'ai eu des problèmes avec les rate limits de Github , qui sont actuellement 5000/h, mais qui semblent aussi avoir une limite à court terme non documentée.


après cela, vous voudrez probablement supprimer vos étiquettes locales aussi. C'est beaucoup plus rapide donc nous pouvons revenir à l'utilisation de xargs et git tag -d , ce qui est suffisant.

git tag | sorting_processing_etc | xargs -L 1 git tag -d
3
répondu TonyH 2017-09-08 00:00:46
la source

si vous utilisez PowerShell, et que vous voulez en supprimer plusieurs:

# Local tags:
git tag -l | foreach { git tag -d $_ }

# Remote tags:
git tag -l | foreach { git push --delete origin $_ }

bien sûr, vous pouvez également les filtrer avant de supprimer:

git tag -l | Where-Object { $_ -like "build-*" } | foreach { git tag -d $_ }
2
répondu rsenna 2017-08-23 14:44:15
la source

si vous avez une étiquette créée à partir du caractère # , par exemple #ST002 , vous pourriez trouver que u est incapable de supprimer en utilisant des modèles normaux. c'est à dire

git tag -d #STOO2

ne supprimera pas l'étiquette, mais l'enveloppera dans une chaîne de caractères littérale comme ainsi

git tag -d "#ST002" or git tag -d '#ST002'

qui le fera supprimer. En espérant que cela aidera quelqu'un qui a fait l'erreur d'utiliser # pour écrire des noms d'étiquette.

2
répondu Royal XL 2018-04-12 19:23:38
la source

voici un cas de test local pour le tester localement sans toucher à une télécommande:

~/p $ mkdir gittest    
~/p/git $ cd gittest/
~/p/gittest $ git init
Initialized empty Git repository in /Users/local_user/p/gittest/.git/
 ~/p/gittest $ touch testfile.txt
 ~/p/gittest $ git add testfile.txt
 ~/p/gittest $ git commit -m "initial commit"
[master (root-commit) 912ce0e] initial commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 testfile.txt
 ~/p/gittest $ git tag
 ~/p/gittest $ git tag -a testtag
 ~/p/gittest $ git tag
testtag
 ~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
b0a6c15cabb990e6d6c46f762891b63608d962f3 refs/tags/testtag
 ~/p/gittest $ cd ..
 ~/p $ mkdir gitbare
 ~/p $ cd gitbare
 ~/p/gitbare $ git init --bare
Initialized empty Git repository in /Users/local_user/p/gitbare/
 ~/p/gitbare $ cd ..
 ~/p $ cd gittest/
 ~/p/gittest $ git remote add origin /Users/local_user/p/gitbare
 ~/p/gittest $ git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 215 bytes | 215.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /Users/local_user/p/gitbare
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
 ~/p/gittest $ git push origin testtag
Counting objects: 1, done.
Writing objects: 100% (1/1), 163 bytes | 163.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To /Users/local_user/p/gitbare
 * [new tag]         testtag -> testtag
 ~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
912ce0e40635c90241fdab756dce7ea34938de57 refs/remotes/origin/master
b0a6c15cabb990e6d6c46f762891b63608d962f3 refs/tags/testtag
 ~/p/gittest $ git push -d origin testtag
To /Users/local_user/p/gitbare
 - [deleted]         testtag
 ~/p/gittest    git tag -d testtag
Deleted tag 'testtag' (was b0a6c15)
 ~/p/gittest $ git show-ref
912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master
912ce0e40635c90241fdab756dce7ea34938de57 refs/remotes/origin/master
 ~/p/gittest
2
répondu Adnan Y 2018-05-03 21:36:00
la source

Autres questions sur git git-tag