Eliminar etiquetas git locales que ya no están en el repositorio remoto
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 origin
que 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
.
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:
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).
Obtenga todas las etiquetas activas del repositorio remoto.
Esto incluso funciona de maravilla en Windows.
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.
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>.pruneTags
opció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