Excluir todas as tags de um repositório Git

224

Quero excluir todas as tags de um repositório Git. Como eu posso fazer isso?

Usando git tag -d tagnameexcluir a tag tagnamelocalmente e git push --tagsatualizando as tags no provedor git.

Eu tentei:

git tag -d *

Mas vejo que isso *significa os arquivos do diretório atual.

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

Considere que tenho muitas tags e quero excluí-las, todas.

Ionică Bizău
fonte

Respostas:

419
git tag | xargs git tag -d

Basta usar a filosofia do Linux, onde você canaliza tudo. No Windows, use git bash com o mesmo comando.

Florian Margaine
fonte
136
Obrigado. Este comando exclui as tags locais. Eu costumava git tag -l | xargs -n 1 git push --delete originexcluí-los do controle remoto.
Jonic Biz
7
E no Windows?
CodeManX
7
@CoDEmanX No Windows, você deve usar o git bash com o mesmo comando.
Inf3rno 12/09/2015
2
Não exclui tags remotos, também é muito lento para milhares de tags.
Adrian Baker
1
'xargs' não é reconhecido como um comando interno ou externo no Windows 10
Gulzar
207

Para excluir tags remotas (antes de excluir tags locais), basta:

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

e exclua as cópias locais:

git tag | xargs git tag -d
karlingen
fonte
A exclusão remota é muito lenta para dezenas de tags.
Ffxsam
5
Esta resposta é muito mais rápido se você tem um monte de marcas remotos: stackoverflow.com/a/34395864/747044
adriaan
A ordem dos comandos nesta resposta assume que não há tags somente locais.
Acumenus 18/01/19
Isso é muito lento, a solução abaixo é melhor.
Root Fool
Se você precisar digitar a senha para confirmações, isso exigirá uma senha para cada tag. A outra solução é melhor.
kap
56

Pode ser mais eficiente pressionar excluir todas as tags em um comando. Especialmente se você tiver várias centenas.

Em um shell não Windows adequado, exclua todas as tags remotas:

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

Em seguida, exclua todas as tags locais:

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

Isso deve ser bom, desde que você não tenha um nome 'em sua tag. Para isso, os seguintes comandos devem estar 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

Provavelmente existem outras maneiras de obter uma lista de linhas, envolvendo-as entre aspas, tornando-as uma única linha e passando essa linha para um comando. Considerando que este é o melhor ambiente para a criação de gatos e tudo.

Richard A Quadling
fonte
3
Eu tinha vários milhares de tags, excluindo-as uma a uma de um repositório de nuvem remoto que levava dias, o que foi resolvido.
Adrian Baker
O que xargs -L 1faz?
ymett 23/07/19
-L linhas máximas - linhas máximas [= linhas máximas] -l [linhas máximas] Use no máximo linhas máximas de linhas de entrada não em branco por linha de comando. Para '-l', o número máximo de linhas é 1 se omitido. Para '-L', o argumento é obrigatório. Espaços em branco à direita fazem com que uma linha de entrada continue logicamente na próxima linha de entrada, com o objetivo de contar as linhas. Implica '-x'. O formato '-l' desta opção foi descontinuado em favor da opção '-L' compatível com POSIX. gnu.org/software/findutils/manual/html_node/find_html/…
Richard A Quadling
@RichardAQuadling Ok, mas que efeito isso tem na resposta? git tagretorna as tags, uma por linha, e as xargs -L 1gera uma por linha, então, para que serve?
ymett
Hummm. Aparentemente nada neste contexto! Além de tornar as coisas um pouco mais lentas!
Richard A quadling
24

Para usuários do Windows que usam o PowerShell:

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

Isso exclui todas as tags retornadas git tagexecutando git tag -dpara cada linha retornada.

Stefan Domnanovits
fonte
23

Adicionando a resposta de Stefan que faltava como excluir tags do controle remoto. Para o Windows PowerShell, você pode executar isso para excluir as tags remotas primeiro, seguidas pelas tags locais.

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

Se você não tiver as tags no seu repositório local, poderá excluir as tags remotas sem precisar levá-las ao seu repositório local.

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

Não se esqueça de substituir "origem" pelo nome do seu manipulador remoto.

Valtoni Boaventura
fonte
Excelente! Isso os excluiu de uma só vez. O outro comando foi eliminar uma a cada 2 segundos
fregante
6

Você também pode usar:

git tag -d $(git tag)
ViZeke
fonte
isso não vai funcionar se você tem um monte de marcas, como milhares
DixonD
neste caso, você pode usar algo como: tag git -d $ (tag git | cabeça -n 999) e executá-lo x vezes
ViZeke
1

Como todas essas opções funcionam apenas no linux, aqui está o equivalente para quem precisa lidar com isso:

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

Eu tenho que excluir as tags com prefixo

por exemplo, eu tenho que excluir as tags v0.0.1, v0.0.2, v0.0.3, v0.0.4, v0.0.5

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

Para listar todas as tags com prefixo

git tag -l "v0.0.*"

Para excluir as tags

git tag -d $tag_names

É assim que a primeira declaração funciona

Brady Huang
fonte
Rápido, simples e eficaz. Trabalhou, obrigado!
Vedran Mandić
0

O Powershell v7 suporta foreach paralelo se você tiver muitas tags upstream (origem) que precisam ser excluídas:

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