Eliminar etiquetas git locales que ya no están en el repositorio remoto

Resuelto kEND asked hace 15 años • 16 respuestas

Usamos etiquetas en git como parte de nuestro proceso de implementación. De vez en cuando, queremos limpiar estas etiquetas eliminándolas de nuestro repositorio remoto.

Esto es bastante sencillo. Un usuario elimina la etiqueta local y la etiqueta remota en un conjunto de comandos. Tenemos un pequeño script de shell que combina ambos pasos.

El segundo (3.º, 4.º,...) usuario ahora tiene etiquetas locales que ya no se reflejan en el control remoto.

Estoy buscando un comando similar al git remote prune originque limpia las ramas de seguimiento local para las cuales se ha eliminado la rama remota.

Alternativamente, se podría usar un comando simple para enumerar etiquetas remotas para compararlas con las etiquetas locales devueltas a través de git tag -l.

kEND avatar Dec 04 '09 00:12 kEND
Aceptado

Esta es una gran pregunta, yo me había estado preguntando lo mismo.

No quería escribir un guión así que busqué una solución diferente. La clave es descubrir que puede eliminar una etiqueta localmente y luego usar git fetch para "recuperarla" del servidor remoto. Si la etiqueta no existe en el control remoto, permanecerá eliminada.

Por lo tanto, deberá escribir dos líneas en orden:

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

Estos:

  1. Elimine todas las etiquetas del repositorio local. FWIW, xargs coloca cada etiqueta generada por "tag -l" en la línea de comando para "tag -d". Sin esto, git no eliminará nada porque no lee la entrada estándar (git tonto).

  2. Obtenga todas las etiquetas activas del repositorio remoto.

Esto incluso funciona de maravilla en Windows.

Richard W avatar Mar 21 '2011 02:03 Richard W

Desde Git v1.7.8 a v1.8.5.6, puedes usar esto:

git fetch <remote> --prune --tags

Actualizar

Esto no funciona en versiones más nuevas de git (a partir de v1.9.0) debido al compromiso e66ef7ae6f31f2 . Realmente no quiero eliminarlo ya que funcionó para algunas personas.

Como lo sugiere "Chad Juliano", con todas las versiones de Git desde la v1.7.8, puedes usar el siguiente comando:

git fetch --prune <remote> +refs/tags/*:refs/tags/*

Es posible que tengas que encerrar la parte de las etiquetas entre comillas (en Windows, por ejemplo) para evitar la expansión de comodines:

git fetch --prune <remote> "+refs/tags/*:refs/tags/*"

NOTA: en todos estos casos, probablemente sea "origen" o cualquier control remoto al que normalmente haga referencia.

loganfsmyth avatar May 01 '2013 00:05 loganfsmyth

Parece que las versiones recientes de Git (estoy en git v2.20) permiten decir simplemente

git fetch --prune --prune-tags

¡Mucho más limpio!

https://git-scm.com/docs/git-fetch#_pruning

También puedes configurar git para que siempre elimine las etiquetas al recuperar:

git config fetch.pruneTags true

Si solo desea eliminar etiquetas cuando las recupera desde un control remoto específico, puede usar la remote.<remote>.pruneTagsopción. Por ejemplo, para podar siempre las etiquetas cuando se obtienen desde el origen pero no desde otros controles remotos,

git config remote.origin.pruneTags true
Nicholas Carey avatar Jan 21 '2019 20:01 Nicholas Carey