Come eliminare un tag remoto?


Risposte:


5755

Devi solo inserire un riferimento 'vuoto' al nome del tag remoto:

git push origin :tagname

O, più espressivamente, usa l' --deleteopzione (o -dse la tua versione git è precedente alla 1.8.0):

git push --delete origin tagname

Nota che git ha lo spazio dei nomi dei tag e lo spazio dei nomi dei rami, quindi puoi usare lo stesso nome per un ramo e per un tag. Se vuoi assicurarti di non poter rimuovere accidentalmente il ramo invece del tag, puoi specificare il riferimento completo che non eliminerà mai un ramo:

git push origin :refs/tags/tagname

Se devi anche eliminare il tag locale, usa:

git tag --delete tagname

sfondo

L'invio di un ramo, tag o altro riferimento a un repository remoto implica la specifica di "quale repository, quale sorgente, quale destinazione?"

git push remote-repo source-ref:destination-ref

Un esempio del mondo reale in cui si spinge il ramo principale nel ramo principale dell'origine è:

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

Che a causa dei percorsi predefiniti, può essere abbreviato in:

git push origin master:master

I tag funzionano allo stesso modo:

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

Che può anche essere abbreviato in:

git push origin release-1.0:release-1.0

Omettendo il riferimento sorgente (la parte prima dei due punti), si spinge "nulla" verso la destinazione, eliminando il riferimento sull'estremità remota.


187
+1 sia per rispondere alla domanda e spiegare il caso generale, sia per descrivere in dettaglio il significato della sintassi integrale
Peter Host,

77
E nel caso in cui qualcuno si chieda come eliminare più tag alla volta, è sufficiente elencarli usando uno spazio bianco, ad es git push --delete origin tag1 tag2. Lo stesso vale per la cancellazione dei tag localigit tag -d tag1 tag2
dVaffection,

8
Se il nome del tag si scontra con il nome di un ramo, si può finire con l'eliminazione del ramo. Ha-ha. Vedi la seconda risposta - è più ecologico
zuba il

1
@EmmaHe A tagè associato a un singolo commit. Per questo motivo il nome del ramo è irrilevante.
cb2

1
È anche interessante sapere che git tag -d `git tag`eliminerà tutti i tag locali. Lo stesso vale per l' git push --delete origin `git tag`assunto che tu abbia estratto i tag remoti localmente. È stato utile in un ambiente di test.
DarkFranX

383

Un modo più semplice è

git push --delete origin YOUR_TAG_NAME

La sintassi del colon con prefisso IMO è un po 'strana in questa situazione


4
Penso che questo sia il modo giusto ... altre sintassi sembrano più degli hack per me.
Luigi R. Viggiano,

11
Sì, questo è semplice e funziona. Sebbene chiarirei la risposta specificando qual è la parte variabile git push --delete origin "TAGNAME":, dove TAGNAME è il nome del tag originale.
Teemu Leisti,

12
Questo funziona Un'aggiunta: se hai un ramo e un tag con lo stesso nome, puoi mettere la parola tagprima del nome del tag per assicurarti di ottenere il tag, non il ramo.
andypaxo,

9
@andypaxo Che il comando richiede è refspecs, il modo corretto sarebbe anteponendo al tag con refs/tags/, in questo modo: refs/tags/v2.3.1.
p3lim,

Avevo in qualche modo creato un nome di tag "cattivo" sul server remoto, che aveva caratteri speciali, quindi non posso sincronizzarlo, così semplicemente rimosso con il tuo suggerimento: git push --delete origin "service-- <default> - 151 ", impossibile rimuoverlo non con intellij, non con stash, non con sourceTree. Grazie !
Dmitri Algazin,

215

Se hai un tag remoto v0.1.0da eliminare e il tuo telecomando è origin, allora semplicemente:

git push origin :refs/tags/v0.1.0

Se devi anche eliminare il tag localmente:

git tag -d v0.1.0

Vedi la risposta di Adam Franco per una spiegazione della :sintassi insolita di Git per la cancellazione.


2
questo funziona anche con jgit. la scorciatoia tag non funziona con jgit
rynop il

Ho fatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1...
Chaim Eliyah,

3
@ChaimEliyah hai una barra iniziale, forse questo è il tuo problema
Joffrey

5
Risposta migliore, poiché funziona anche se hai un ramo e un tag chiamato lo stesso.
Erik A. Brandstadmoen,

Proprio :tagnamedovrebbe funzionare per la cancellazione remota.
Acumenus,

106

Elimina tutti i tag locali e ottieni l'elenco dei tag remoti :

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

Rimuovi tutti i tag remoti

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

Pulisci tag locali

git tag -l | xargs git tag -d

2
Come rimuovere tutti i tag dai repository locali e remoti. Questo è quello che stavo cercando, grazie!
Jorge Orpinel,

vai a prendere, elimina il telecomando e poi pulisci la gente del posto, ha funzionato magnificamente!
DiegoR Baquero,

lento, ma il più semplice
Lucent Fox,

34

Per rimuovere il tag dal repository remoto:

git push --delete origin TAGNAME

Puoi anche eliminare il tag localmente:

git tag -d TAGNAME

quindi una riga per fare entrambe le cose:git push --delete origin TAGNAME && git tag -d TAGNAME
sakurashinken,

25

Dal tuo terminale, fai come segue:

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

Ora vai su Github.com e aggiorna, scompaiono.


3
tag git non tag
DSF

23
git tag -d your_tag_name
git push origin :refs/tags/your_tag_name
  1. Prima riga, cancella your_tag_namedal repository locale .
  2. Seconda riga, cancella your_tag_namedal repository remoto .
  3. Premi il pulsante Elimina bozza nella sezione Rilasci di GitHub .

inserisci qui la descrizione dell'immagine


2
Mentre questo comando può rispondere alla domanda, fornendo un contesto aggiuntivo riguardo al perché e / o al modo in cui questo codice risponde alla domanda ne migliora il valore a lungo termine. Come rispondere
Popo

20

Elimina tag locale "12345"

git tag -d 12345

Elimina il tag remoto "12345" (ad es. Anche versione GitHub)

git push origin :refs/tags/12345

approccio alternativo

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

inserisci qui la descrizione dell'immagine


15

Si noti che, se si dispone di un ramo remoto denominato come tag remoto, questi comandi sono ambigui:

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

Quindi è necessario utilizzare questo comando per eliminare il tag:

git push origin :refs/tags/<tag>

e questo per cancellare il ramo:

git push origin :refs/heads/<branch>

In caso contrario, si otterrebbe un errore come questo:

error: dst refspec <tagname> matches more than one.
error: failed to push some refs to '<repo>'

Breve e conciso. Questo post insieme a MeganZhou è apparso come la risposta al motivo per cui stavamo riscontrando problemi, il nome della filiale e il tagname erano identici. Ho cancellato il tag locale e ho premuto: refs / tags e tutto è andato bene.
rwheadon,

12

Metodo fino a 100 volte più veloce per migliaia di tag remoti

Dopo aver letto queste risposte mentre ho bisogno di eliminare oltre 11.000 tag, ho imparato questi metodi facendo affidamento o xargsimpiegando troppo tempo, a meno che tu non abbia ore da masterizzare.

Lottando, ho trovato due modi molto più veloci. Per entrambi, iniziare con git tago git ls-remote --tagsper creare un elenco di tag che si desidera eliminare sul telecomando. Negli esempi seguenti puoi omettere o sostituire sorting_proccessing_etccon qualsiasi greping, sorting, tailing o heading che desideri ( ad es. grep -P "my_regex" | sort | head -n -200 Ecc. ):


Questo primo metodo è di gran lunga il più veloce, forse da 20 a 100 volte più veloce dell'uso xargse funziona con almeno diverse migliaia di tag alla volta.

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

Come funziona? L'elenco normale di tag separati da riga viene convertito in una singola riga di tag separati da spazio, ciascuno con l'anteprima :. . .

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

L'uso git pushcon questo tag di formato non inserisce nulla in ogni riferimento remoto, cancellandolo (il formato normale per spingere in questo modo è local_ref_path:remote_ref_path).

Il metodo due è suddiviso come risposta separata altrove in questa stessa pagina


Dopo entrambi questi metodi, probabilmente vorrai eliminare anche i tag locali. Questo è molto più veloce, quindi possiamo tornare a usare xargse git tag -d, che è sufficiente.

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

O simile all'eliminazione remota:

git tag -d $(< git tag | sorting_processing_etc | paste -sd " ")

Dovresti dividerlo in alcune risposte diverse. La risposta con più tag su una riga è, senza dubbio, la risposta giusta per la cancellazione collettiva di tag. In realtà è un po 'difficile trovare queste informazioni quasi ovunque. Anche sapendo cosa sto cercando, faccio fatica a trovarlo nella pagina di aiuto di git :) Quindi complimenti a te ed evidenziarlo come la risposta giusta, e sposta l'API GitHub in un altro posto. E infine, l'eliminazione dei tag localmente, in blocco, funziona con tag delimitati da spazio (elimina i due punti)
CubanX,

Grazie per gli elogi e i suggerimenti. Lo dividerò. Non capisco il tuo commento sulla cancellazione dei tag locali. Non credo che il mio frammento di comando finale utilizzi due punti, ma sono sul cellulare quindi forse mi manca qualcosa.
TonyH,

Siamo spiacenti, intendevo solo che quello che stai facendo per eliminare i tag remoti, funziona con l'eliminazione dei tag locali, fornendo l'intero elenco in una volta. :) Invece di git push origin: tag1: tag2 ecc. Faresti git tag - elimina tag1 tag2 tag3 in questo modo puoi avere una pulizia totale. Ancora grazie mille!
CubanX

11

Se usi SourceTree - un'ottima GUI di Git - puoi farlo facilmente senza la riga di comando nel modo seguente:

  1. Apri il tuo repository in SourceTree
  2. Seleziona ed espandi la scheda "Tag" a sinistra
  3. Fare clic con il tasto destro del mouse sul tag che si desidera eliminare
  4. Seleziona "Elimina YOUR_TAG_NAME"
  5. Nella finestra di verifica, seleziona "Rimuovi tag dai telecomandi"

YOUR_TAG_NAME verrà ora rimosso dal tuo repository locale e da tutti i telecomandi, che si tratti di GitHub, BitBucket o di qualsiasi altro posto elencato come remoto per quel repository.

Inoltre, se hai eliminato un tag localmente ma non sulle origini remote e desideri eliminarlo ovunque, crea un nuovo tag con lo stesso nome ed è associato allo stesso commit delle origini. Quindi, ripetere i passaggi sopra per eliminare ovunque.


Funziona come un fascino. Grazie!
Native_Mobile_Arch_Dev


7

Se stai usando PowerShell e vuoi eliminarne alcuni:

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

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

Naturalmente, puoi anche filtrarli prima di eliminare:

git tag -l | Where-Object { $_ -like "build-*" } | foreach { git tag -d $_ }

Questo è stato un buon esempio di regexp. Grazie bravo signore
Yunus il

7

Come suggerito da @CubanX, ho diviso questa risposta dal mio originale:

Ecco un metodo che è molte volte più veloce di xargse potrebbe ridimensionarsi molto di più con la modifica. Utilizza l' API Github , un token di accesso personale e sfrutta 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\"`

parallelha molte modalità operative, ma generalmente parallelizza qualsiasi comando impartito, consentendo al contempo di impostare limiti sul numero di processi. È possibile modificare il --jobs 2parametro per consentire un funzionamento più rapido, ma ho avuto problemi con i limiti di velocità di Github , che attualmente sono 5000 / ora, ma sembra anche avere un limite a breve termine non documentato.


Successivamente, probabilmente vorrai eliminare anche i tag locali. Questo è molto più veloce, quindi possiamo tornare a usare xargse git tag -d, che è sufficiente.

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

Questo sembra molto più complicato della risposta accettata. Qual è il vantaggio?
theUtherSide

2
Se devi eliminare diverse migliaia di tag, la velocità è 10-100 volte più veloce
TonyH,

Grazie per il chiarimento. L'OP ha chiesto di eliminare un singolo tag. Non riuscivo a immaginare perché qualcuno avrebbe usato questo approccio per un singolo tag. Forse questa risposta è migliore per un'altra domanda che comporta l'eliminazione di molti tag
Ultra Lato

Non penso che esista. Potrei crearlo per rispondere a me stesso. Vuoi pensare che sia appropriato?
TonyH,

1
Lo voglio! Penso che sia una pratica abbastanza comune qui, in realtà.
theUtherSide

6

Le altre risposte indicano come ottenere questo risultato, ma è necessario tenere presente le conseguenze poiché si tratta di un repository remoto.

La pagina man del tag git, nella sezione Su ricodifica , contiene una buona spiegazione su come informare cortesemente gli altri utenti del repository remoto della modifica. Offrono anche un comodo modello di annuncio per comunicare come gli altri dovrebbero ottenere le tue modifiche.


6

Volevo rimuovere tutti i tag tranne quelli che corrispondono a un modello in modo da poter eliminare tutti tranne gli ultimi due mesi di tag di produzione, ecco cosa ho usato per un grande successo:

Elimina tutti i tag remoti ed escludi espressione da Elimina

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

Elimina tutti i tag locali ed escludi espressione da Elimina

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs git tag -d

5

Script semplice per rimuovere il tag dato da entrambe le posizioni locali e di origine. Con un controllo se il tag esiste davvero.

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

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

Come usare:

  • Crea il file di script della shell (ad es. Git-tag-purge.sh) e incolla il contenuto.
  • chmod il tuo file di script per renderlo eseguibile.
  • Rendi lo script disponibile a livello globale
  • cd per il tuo progetto git
  • Call script (ad es
    $> git-tag-purge.sh nome_tag
    )

4

Sembra molto lavoro per qualcosa che xargsgià fa. Guardando indietro a questo thread, immagino che la lentezza con xargscui hai sperimentato sia perché la risposta originale è stata usata xargs -n 1quando non ce n'era davvero bisogno.

Ciò equivale al metodo uno tranne per il fatto che xargssi occupa automaticamente della lunghezza massima della riga di comando:

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

xargspuò eseguire processi anche in parallelo. Metodo 2 con xargs:

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

Quanto sopra utilizza un massimo di 5 processi per gestire un massimo di 100 argomenti in ciascun processo. Puoi sperimentare gli argomenti per trovare ciò che funziona meglio per le tue esigenze.


Interessante. Ogni giorno impari qualcosa di nuovo su un comando Unix. Dovrò testare il mio caso d'uso con questa alternativa.
TonyH,

4

Se hai creato un tag che inizia con il carattere # , ad esempio #ST002, potresti scoprire che non sei in grado di eliminare usando i normali schemi. vale a dire

git tag -d #STOO2

Non eliminerà il tag, ma lo avvolgerà in una stringa letterale in questo modo

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

Questo lo cancellerà. Sperando che possa aiutare qualcuno che ha commesso l'errore di usare # per scrivere i nomi dei tag.


2

Ecco un testcase locale per testarlo localmente senza fare scherzi con un telecomando:

~/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

1

Ciao volevo solo condividere un alias che ho creato che fa la stessa cosa:

Aggiungi quanto segue a ~ / .gitconfig

[alias]
    delete-tag = "!f() { \
            echo 'deleting tag' $1 'from remote/origin ausing command: git push --delete origin tagName;'; \
            git push --delete origin $1; \
            echo 'deleting tag' $1 'from local using command: git tag -d tagName;'; \
            git tag -d $1; \
        }; f"

L'utilizzo è simile a:

-->git delete-tag v1.0-DeleteMe
deleting tag v1.0-DeleteMe from remote/origin ausing command: git push --delete origin tagName;
To https://github.com/jsticha/pafs
 - [deleted]             v1.0-DeleteMe
deleting tag v1.0-DeleteMe from local using command: git tag -d tagName;
Deleted tag 'v1.0-DeleteMe' (was 300d3ef22)
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.