Elimina tutti i tag da un repository Git


224

Voglio eliminare tutti i tag da un repository Git. Come lo posso fare?

Usando git tag -d tagnameelimina il tag tagnamelocalmente e usando git push --tagsaggiorno i tag sul provider git.

Provai:

git tag -d *

Ma vedo che *significa che i file dalla directory corrente.

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

Considera che ho molti tag e voglio eliminarli tutti.

Risposte:


419
git tag | xargs git tag -d

Usa semplicemente la filosofia di Linux dove installi tutto. Su Windows usa git bash con lo stesso comando.


136
Grazie. Questo comando elimina i tag locali. Ho usato git tag -l | xargs -n 1 git push --delete originper cancellarli dal telecomando.
Ionică Bizău,

7
E su Windows?
CodeManX

7
@CoDEmanX Su Windows dovresti usare git bash con lo stesso comando.
inf3rno,

2
Non elimina i tag remoti, anche molto lenti per migliaia di tag.
Adrian Baker,

1
'xargs' non è riconosciuto come comando interno o esterno su Windows 10
Gulzar,

207

Per eliminare i tag remoti (prima di eliminare i tag locali) è sufficiente:

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

e quindi eliminare le copie locali:

git tag | xargs git tag -d

L'eliminazione remota è troppo lenta per dozzine di tag.
ffxsam,

5
Questa risposta è modo più veloce se si dispone di un sacco di tag remoti: stackoverflow.com/a/34395864/747044
Adriaan

L'ordine dei comandi in questa risposta presuppone che non ci siano tag solo locali.
Acumenus,

Questo è troppo lento, la soluzione di seguito è migliore.
Root Fool

Se è necessario inserire passphrase per commit, questo richiede passphrase per ogni tag. L'altra soluzione è migliore.
Kap il

56

Potrebbe essere più efficiente inviare tutti i tag in un solo comando. Soprattutto se ne hai diverse centinaia.

In una shell non Windows adatta, eliminare tutti i tag remoti:

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

Quindi eliminare tutti i tag locali:

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

Questo dovrebbe essere OK fintanto che non hai un nome 'nei tag. Per questo, i seguenti comandi dovrebbero essere 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

Probabilmente esistono altri modi per prendere un elenco di righe, racchiuderle tra virgolette, renderle una singola riga e quindi passare quella riga a un comando. Considerando questo è l'ultimo ambiente di pelatura del gatto e tutto il resto.


3
Avevo diverse migliaia di tag, eliminarli uno ad uno da un repository cloud remoto richiedeva giorni, cosa che questo ha risolto.
Adrian Baker,

Che cosa xargs -L 1fa?
ymett,

-L max-lines --max-lines [= max-lines] -l [max-lines] Utilizza al massimo max-righe righe di input non vuote per riga di comando. Per '-l', per impostazione predefinita max-line è 1 se omesso. Per "-L", l'argomento è obbligatorio. Gli spazi vuoti finali fanno sì che una riga di input continui logicamente sulla riga di input successiva, allo scopo di contare le righe. Implica "-x". La forma '-l' di questa opzione è obsoleta a favore dell'opzione '-L' conforme a POSIX. gnu.org/software/findutils/manual/html_node/find_html/…
Richard A Quadling

@RichardAQuadling Ok, ma che effetto ha sulla risposta? git tagrestituisce i tag, uno per riga, quindi xargs -L 1li restituisce uno per riga, quindi a cosa serve?
ymett,

Hmmm. Apparentemente nulla in questo contesto! Oltre a rendere le cose un po 'più lente!
Richard A Quadling,

24

Per utenti Windows che usano PowerShell:

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

Questo elimina tutti i tag restituiti git tageseguendo git tag -dper ogni riga restituita.


23

Aggiungendo alla risposta di Stefan che mancava come eliminare i tag dal telecomando. Per Windows PowerShell è possibile eseguirlo per eliminare prima i tag remoti seguiti dai tag locali.

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

19

Se i tag non sono presenti nel repository locale, è possibile eliminare i tag remoti senza doverli portare nel repository locale.

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

Non dimenticare di sostituire "origine" con il nome del gestore remoto.


Eccellente! Questo li ha eliminati tutti in una volta sola. L'altro comando è stato l'eliminazione di uno ogni 2 secondi
fregante


6

Puoi anche usare:

git tag -d $(git tag)

questo non funzionerà se hai molti tag, come migliaia
DixonD

in questo caso potresti usare qualcosa come: git tag -d $ (git tag | head -n 999) ed eseguirlo x volte
ViZeke

1

Poiché tutte queste opzioni funzionano solo su Linux, ecco l'equivalente di Windows per chiunque debba occuparsene:

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

1

Devo eliminare i tag con prefisso

ad esempio, devo eliminare i tag v0.0.1, v0.0.2, v0.0.3, v0.0.4, v0.0.5

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

Per elencare tutti i tag con prefisso

git tag -l "v0.0.*"

Per eliminare i tag

git tag -d $tag_names

Ecco come funziona la prima affermazione


Veloce, semplice ed efficace. Ha funzionato, grazie!
Vedran Mandić,

0

Powershell v7 supporta foreach parallelo se hai molti tag upstream (origine) che devi eliminare:

git tag | foreach-object -Parallel { 
git push origin --delete $_ 
git tag -d $_ 
}
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.