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 usuario (tercero, cuarto, ...) 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 localmente las ramas de seguimiento para las que se ha eliminado la rama remota.
Alternativamente, se podría usar un comando simple para enumerar etiquetas remotas para comparar con las etiquetas locales devueltas mediante git tag -l
.
git config fetch.pruneTags true
hará quegit fetch
hagas lo que quieras! Vea mi respuesta a esta otra pregunta .Respuestas:
Buena pregunta. :) No tengo una respuesta completa ...
Dicho esto, puede obtener una lista de etiquetas remotas a través de
git ls-remote
. Para enumerar las etiquetas en el repositorio al que hace referenciaorigin
, debe ejecutar:Eso devuelve una lista de hashes y nombres de etiquetas amigables, como:
Ciertamente, podría armar un script bash para comparar las etiquetas generadas por esta lista con las etiquetas que tiene localmente. Eche un vistazo a
git show-ref --tags
, que genera los nombres de etiqueta en la misma forma quegit ls-remote
).Como un aparte,
git show-ref
tiene una opción que hace lo contrario de lo que le gustaría. El siguiente comando enumeraría todas las etiquetas en la rama remota que no tiene localmente:fuente
git remote | xargs -L 1 git ls-remote --tags | git show-ref --tags --exclude-existing
Esta es una gran pregunta, 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, luego usar git fetch para "recuperarla" desde el servidor remoto. Si la etiqueta no existe en el control remoto, permanecerá eliminada.
Por lo tanto, debe escribir dos líneas en orden:
Estas:
Eliminar todas las etiquetas del repositorio local. FWIW, xargs coloca cada salida de etiqueta por "etiqueta -l" en la línea de comando para "etiqueta -d". Sin esto, git no eliminará nada porque no lee stdin (tonto git).
Obtenga todas las etiquetas activas del repositorio remoto.
Esto incluso funciona de maravilla en Windows.
fuente
git tag prune origin
comando.git tag -l | %{git tag -d $_}
para que esto funcionara en PowerShell. No estoy seguro de nadie más.Desde Git v1.7.8 a v1.8.5.6, puede usar esto:
Actualizar
Esto no funciona en versiones más nuevas de git (comenzando con v1.9.0) debido a commit e66ef7ae6f31f2 . Sin embargo, realmente no quiero eliminarlo ya que funcionó para algunas personas.
Como lo sugiere "Chad Juliano", con todas las versiones de Git desde v1.7.8, puede usar el siguiente comando:
Es posible que deba encerrar la parte de las etiquetas con comillas (en Windows, por ejemplo) para evitar la expansión de comodines:
fuente
git fetch --prune <remote> +refs/tags/*:refs/tags/*
no funcionó en ZSH pero funciona en BASH*
pero si cita entre comillas eso debería estar bien.git fetch origin --prune --prune-tags
ORgit fetch origin --prune 'refs/tags/*:refs/tags/*'
ORgit fetch <url of origin> --prune --prune-tags
ORgit fetch <url of origin> --prune 'refs/tags/*:refs/tags/*'
git fetch origin --prune --prune-tags
pode las ramas y etiquetas de seguimiento remoto. comprobado en la versión git 2.18.Si solo desea esas etiquetas que existen en el control remoto, simplemente elimine todas sus etiquetas locales:
Y luego busque todas las etiquetas remotas:
fuente
xargs
. Si tiene más etiquetas queARG_MAX
, o limitaciones similares, esto no funcionará. Improbable, pero posible, y por esoxargs
es genial.git config --global alias.prune-tags '!git tag -d $(git tag) && git fetch --tags'
Comando de alias obligatorio. Disfrutar. :-)Parece que las versiones más recientes de Git (estoy en git v2.20) permiten simplemente decir
Mucho más limpio!
https://git-scm.com/docs/git-fetch#_pruning
También puede configurar git para que siempre pode las etiquetas al buscar:
Si solo desea podar etiquetas al buscar desde un control remoto específico, puede usar la
remote.<remote>.pruneTags
opción. Por ejemplo, para podar siempre las etiquetas al buscar desde el origen pero no otros controles remotos,fuente
Todas las versiones de Git desde v1.7.8 se entienden
git fetch
con una refspec, mientras que desde v1.9.0 la--tags
opción anula la--prune
opción. Para una solución de uso general, intente esto:Para obtener más información sobre cómo cambió el comportamiento "--tags" con "--prune" en Git v1.9.0, consulte: https://github.com/git/git/commit/e66ef7ae6f31f246dead62f574cc2acb75fd001c
fuente
origin
conupstream
y git corrigió mis etiquetas locales basadas en el flujo ascendente; A continuación,git push origin :<deleted-tag-name>
actualicé mi bifurcación de GitHub, eliminando la etiqueta eliminada.git fetch --prune --prune-tags origin
git fetch origin --prune --prune-tags
Ogit fetch origin --prune 'refs/tags/*:refs/tags/*'
Ogit fetch <url of origin> --prune --prune-tags
Ogit fetch <url of origin> --prune 'refs/tags/*:refs/tags/*'
Git admite de forma nativa la limpieza de etiquetas locales:
Este comando extrae las últimas etiquetas y elimina todas las etiquetas eliminadas.
fuente
Este es un buen método:
git tag -l | xargs git tag -d && git fetch -t
Fuente: demisx.GitHub.io
fuente
Muestre la diferencia entre etiquetas locales y remotas:
git tag
da la lista de etiquetas localesgit ls-remote --tags
da la lista de rutas completas a etiquetas remotascut -f2 | grep -v '\^' | sed 's#refs/tags/##'
analiza solo el nombre de la etiqueta de la lista de rutas de etiquetas remotasLas líneas que comienzan con "<" son sus etiquetas locales que ya no están en el repositorio remoto. Si son pocos, puede eliminarlos manualmente uno por uno, si son muchos, hace más greping y tuberías para automatizarlo.
fuente
diff <(git tag | sort) <( git ls-remote --tags origin | cut -f2 | grep -v '\^' | sed 's#refs/tags/##' | sort) | grep ">" | cut -c3- | xargs -I{} git push origin :refs/tags/{}
diff <(git show-ref --tags | grep -v '{}' | awk '{print $1 " " $2}') <(git ls-remote --tags origin | grep -v '{}' | awk '{print $1 " " $2}')
<
, sino un número seguido de una coma y luego lo que parecen los primeros tres caracteres de un hash de confirmación (?), por ejemplo7,8d4
...Acabo de agregar un comando git sync-local-tags a pivotal_git_scripts Gem fork en GitHub:
https://github.com/kigster/git_scripts
Instale la gema, luego ejecute "git sync-local-tags" en su repositorio para eliminar las etiquetas locales que no existen en el control remoto.
Alternativamente, puede instalar este script a continuación y llamarlo "git-sync-local-tags":
fuente
Sé que llego tarde a la fiesta, pero ahora hay una respuesta rápida a esto:
Sí, ahora es una opción para buscar.
Si no quieres buscar y simplemente podar:
fuente
¿Qué tal esto? ¿Descartar todas las etiquetas locales y luego volver a buscarlas? Teniendo en cuenta que su repositorio puede contener submódulos:
fuente
TortoiseGit puede comparar etiquetas ahora.
El registro izquierdo está en remoto, el derecho está en local.
Usando la función Comparar etiquetas del cuadro de diálogo Sincronizar:
Ver también el número 2973 de TortoiseGit
fuente
La misma respuesta que @Richard W pero para Windows (PowerShell)
fuente
Agrego el comando a
SourceTree
como Acción personalizada en mi MacOS.Configuración
Custom Actions
porSourcetree
->Preferences...
->Custom Actions
Script to run
tiene que ser elgit
camino.Yo uso
git fetch --prune --prune-tags origin
para sincronizar etiquetas de remoto a local.fuente
En la nueva versión de git (como v2.26.2)
Entonces necesitarías correr:
fuente