Eliminar todas las etiquetas de un repositorio Git

224

Quiero eliminar todas las etiquetas de un repositorio de Git. ¿Cómo puedo hacer eso?

Usando git tag -d tagnameeliminar la etiqueta tagnamelocalmente y usando git push --tagsActualizo las etiquetas en el proveedor git

Lo intenté:

git tag -d *

Pero veo que eso *significa los archivos del directorio actual.

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

Considere que tengo muchas etiquetas, y quiero eliminarlas, todas.

Ionică Bizău
fuente

Respuestas:

419
git tag | xargs git tag -d

Simplemente use la filosofía de Linux donde canaliza todo. En Windows use git bash con el mismo comando.

Florian Margaine
fuente
136
Gracias. Este comando elimina las etiquetas locales. Solía git tag -l | xargs -n 1 git push --delete origineliminarlos del control remoto.
Ionică Bizău
77
¿Y en Windows?
CodeManX
77
@CoDEmanX En Windows debe usar git bash con el mismo comando.
inf3rno
2
No elimina etiquetas remotas, también es muy lento para miles de etiquetas.
Adrian Baker
1
'xargs' no se reconoce como un comando interno o externo en Windows 10
Gulzar
207

Para eliminar etiquetas remotas (antes de eliminar etiquetas locales) simplemente haga:

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

y luego elimine las copias locales:

git tag | xargs git tag -d
karlingen
fuente
La eliminación remota es demasiado lenta para docenas de etiquetas.
ffxsam
55
Esta respuesta es mucho más rápida si tiene muchas etiquetas remotas: stackoverflow.com/a/34395864/747044
adriaan
El orden de los comandos en esta respuesta supone que no hay etiquetas solo locales.
Acumenus
Esto es demasiado lento, la solución a continuación es mejor.
Root Fool
Si necesita ingresar una frase de contraseña para las confirmaciones, esto requiere una frase de contraseña para cada etiqueta. La otra solución es mejor.
kap
56

Puede ser más eficiente presionar eliminar todas las etiquetas en un comando. Especialmente si tienes varios cientos.

En un shell adecuado que no sea de Windows, elimine todas las etiquetas remotas:

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

Luego elimine todas las etiquetas locales:

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

Esto debería estar bien siempre que no tenga un nombre 'en sus etiquetas. Para eso, los siguientes comandos deberían estar bien.

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

Probablemente existan otras formas de tomar una lista de líneas, envolverlas entre comillas, convertirlas en una sola línea y luego pasar esa línea a un comando. Teniendo en cuenta que este es el mejor entorno para desollar gatos y todo.

Richard A Quadling
fuente
3
Tenía varios miles de etiquetas, eliminarlas una por una de un repositorio remoto en la nube llevaba días, lo que esto resolvió.
Adrian Baker
¿Qué hace el xargs -L 1?
ymett el
-L max-lines --max-lines [= max-lines] -l [max-lines] Utilice como máximo líneas de entrada no en blanco de max-lines por línea de comando. Para '-l', el máximo de líneas por defecto es 1 si se omite. Para '-L', el argumento es obligatorio. Los espacios en blanco finales hacen que una línea de entrada se continúe lógicamente en la siguiente línea de entrada, con el fin de contar las líneas. Implica '-x'. La forma '-l' de esta opción está en desuso a favor de la opción '-L' compatible con POSIX. gnu.org/software/findutils/manual/html_node/find_html/…
Richard A Quadling
@RichardAQuadling Ok, pero ¿qué efecto tiene eso en la respuesta? git tagdevuelve las etiquetas, una por línea, y luego las xargs -L 1genera una por línea, entonces, ¿para qué sirve?
ymett
Hmmm ¡Al parecer nada en este contexto! ¡Aparte de hacer las cosas un poco más lentas!
Richard A Quadling
24

Para usuarios de Windows que usan PowerShell:

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

Esto elimina todas las etiquetas devueltas git tagal ejecutar git tag -dcada línea devuelta.

Stefan Domnanovits
fuente
23

Agregando a la respuesta de Stefan que faltaba cómo eliminar etiquetas del control remoto. Para Windows Powershell, puede ejecutar esto para eliminar las etiquetas remotas primero seguidas de las etiquetas locales.

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

Si no tiene las etiquetas en su repositorio local, puede eliminar las etiquetas remotas sin tener que llevarlas a su repositorio local.

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

No olvide reemplazar "origen" por el nombre de su controlador remoto.

Valtoni Boaventura
fuente
¡Excelente! Esto los eliminó a todos de una vez. El otro comando
borraba
6

También puedes usar:

git tag -d $(git tag)
ViZeke
fuente
esto no funcionará si tiene muchas etiquetas, como miles
DixonD
en este caso, podría usar algo como: git tag -d $ (git tag | head -n 999) y ejecutarlo x veces
ViZeke
1

Como todas estas opciones solo funcionan en Linux, aquí está el equivalente de Windows para cualquiera que tenga que lidiar con eso:

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

Tengo que borrar las etiquetas con prefijo

por ejemplo, tengo que eliminar las etiquetas v0.0.1, v0.0.2, v0.0.3, v0.0.4, v0.0.5

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

Para enumerar todas las etiquetas con prefijo

git tag -l "v0.0.*"

Para borrar las etiquetas

git tag -d $tag_names

Así es como funciona la primera declaración

Brady Huang
fuente
Rápido, simple y efectivo. Trabajado, gracias!
Vedran Mandić
0

Powershell v7 admite foreach paralelo si tiene muchas etiquetas ascendentes (origen) que necesita eliminar:

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