Come si elimina un tag Git che è già stato inviato?
Come si elimina un tag Git che è già stato inviato?
Risposte:
Devi solo inserire un riferimento 'vuoto' al nome del tag remoto:
git push origin :tagname
O, più espressivamente, usa l' --delete
opzione (o -d
se 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
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.
git push --delete origin tag1 tag2
. Lo stesso vale per la cancellazione dei tag localigit tag -d tag1 tag2
tag
è associato a un singolo commit. Per questo motivo il nome del ramo è irrilevante.
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.
Un modo più semplice è
git push --delete origin YOUR_TAG_NAME
La sintassi del colon con prefisso IMO è un po 'strana in questa situazione
git push --delete origin "TAGNAME"
:, dove TAGNAME è il nome del tag originale.
tag
prima del nome del tag per assicurarti di ottenere il tag, non il ramo.
refs/tags/
, in questo modo: refs/tags/v2.3.1
.
Se hai un tag remoto v0.1.0
da 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.
fatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1
...
:tagname
dovrebbe funzionare per la cancellazione remota.
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
Per rimuovere il tag dal repository remoto:
git push --delete origin TAGNAME
Puoi anche eliminare il tag localmente:
git tag -d TAGNAME
git push --delete origin TAGNAME && git tag -d TAGNAME
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.
git tag -d your_tag_name
git push origin :refs/tags/your_tag_name
your_tag_name
dal repository locale .your_tag_name
dal repository remoto .git tag -d 12345
git push origin :refs/tags/12345
git push --delete origin tagName
git tag -d tagName
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>'
Dopo aver letto queste risposte mentre ho bisogno di eliminare oltre 11.000 tag, ho imparato questi metodi facendo affidamento o xargs
impiegando troppo tempo, a meno che tu non abbia ore da masterizzare.
Lottando, ho trovato due modi molto più veloci. Per entrambi, iniziare con git tag
o git ls-remote --tags
per creare un elenco di tag che si desidera eliminare sul telecomando. Negli esempi seguenti puoi omettere o sostituire sorting_proccessing_etc
con qualsiasi grep
ing, sort
ing, tail
ing o head
ing che desideri ( ad es. grep -P "my_regex" | sort | head -n -200
Ecc. ):
xargs
e 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 push
con 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
).
Dopo entrambi questi metodi, probabilmente vorrai eliminare anche i tag locali. Questo è molto più veloce, quindi possiamo tornare a usare xargs
e 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 " ")
Se usi SourceTree - un'ottima GUI di Git - puoi farlo facilmente senza la riga di comando nel modo seguente:
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.
Se hai creato un tag chiamato release01
in un repository Git, lo rimuoveresti dal tuo repository procedendo come segue:
git tag -d release01
git push origin :refs/tags/release01
Per rimuoverne uno da un repository Mercurial:
hg tag --remove featurefoo
Fare riferimento https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551
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 $_ }
Come suggerito da @CubanX, ho diviso questa risposta dal mio originale:
xargs
e 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\"`
parallel
ha molte modalità operative, ma generalmente parallelizza qualsiasi comando impartito, consentendo al contempo di impostare limiti sul numero di processi. È possibile modificare il --jobs 2
parametro 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 xargs
e git tag -d
, che è sufficiente.
git tag | sorting_processing_etc | xargs -L 1 git tag -d
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.
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
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:
$> git-tag-purge.sh nome_tag)
Sembra molto lavoro per qualcosa che xargs
già fa. Guardando indietro a questo thread, immagino che la lentezza con xargs
cui hai sperimentato sia perché la risposta originale è stata usata xargs -n 1
quando non ce n'era davvero bisogno.
Ciò equivale al metodo uno tranne per il fatto che xargs
si occupa automaticamente della lunghezza massima della riga di comando:
git tag | sorting_processing_etc | xargs git push --delete origin
xargs
può 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.
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.
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
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)