tipos tag repositorio remote example etiquetas eliminar crear git git-tag

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



git remote (11)

Utilizamos 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 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 a git remote prune origin que limpia localmente las ramas de seguimiento para las cuales se ha eliminado la rama remota.

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


¿Qué tal esto? ¿Dejar caer todas las etiquetas locales y luego volver a buscarlas? Teniendo en cuenta su repositorio podría contener submódulos:

git submodule foreach --recursive ''git tag | xargs git tag -d'' (alternatively, "for i in `find .git -type d -name ''*tags*''`; do rm -f $i/*; done") git fetch -t git submodule foreach --recursive git fetch -t


Acaba 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":

#!/usr/bin/env ruby # Delete tags from the local Git repository, which are not found on # a remote origin # # Usage: git sync-local-tags [-n] # if -n is passed, just print the tag to be deleted, but do not # actually delete it. # # Author: Konstantin Gredeskoul (http://tektastic.com) # ####################################################################### class TagSynchronizer def self.local_tags `git show-ref --tags | awk ''{print $2}''`.split(//n/) end def self.remote_tags `git ls-remote --tags origin | awk ''{print $2}''`.split(//n/) end def self.orphaned_tags self.local_tags - self.remote_tags end def self.remove_unused_tags(print_only = false) self.orphaned_tags.each do |ref| tag = ref.gsub /refs//tags///, '''' puts "deleting local tag #{tag}" `git tag -d #{tag}` unless print_only end end end unless File.exists?(".git") puts "This doesn''t look like a git repository." exit 1 end print_only = ARGV.include?("-n") TagSynchronizer.remove_unused_tags(print_only)


Buena pregunta. :) No tengo una respuesta completa ...

Dicho esto, puede obtener una lista de etiquetas remotas a través de git ls-remote . Para listar las etiquetas en el repositorio referenciado por origin , ejecutarías:

git ls-remote --tags origin

Eso devuelve una lista de hashes y nombres de etiquetas amigables, como:

94bf6de8315d9a7b22385e86e1f5add9183bcb3c refs/tags/v0.1.3 cc047da6604bdd9a0e5ecbba3375ba6f09eed09d refs/tags/v0.1.4 ... 2f2e45bedf67dedb8d1dc0d02612345ee5c893f2 refs/tags/v0.5.4

Sin duda, podría crear un script de 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 las etiquetas en la misma forma que git ls-remote ).

Además, git show-ref tiene una opción que hace lo contrario de lo que le gustaría. El siguiente comando enumera todas las etiquetas en la rama remota que no tiene localmente:

git ls-remote --tags origin | git show-ref --tags --exclude-existing


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

git fetch <remote> --prune --tags

Actualizar

Esto no funciona en las versiones más recientes de git (comenzando con v1.9.0) debido a commit e66ef7ae6f31f2 . Aunque realmente no quiero eliminarlo, ya que funcionó para algunas personas.

Según lo sugerido por "Chad Juliano", con todas las versiones de Git desde v1.7.8, puede usar el siguiente comando:

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

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

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


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

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

Por lo tanto necesitas escribir dos líneas en orden:

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

Estas:

  1. Eliminar todas las etiquetas del repositorio local. FWIW, xargs coloca cada salida de etiqueta por "tag -l" en la línea de comando para "tag -d". Sin esto, git no borrará nada porque no lee stdin (tonto git).

  2. Recupera todas las etiquetas activas del repositorio remoto.

Esto incluso funciona bien en Windows.


Git admite de forma nativa la limpieza de etiquetas locales:

git fetch --tags --prune

Este comando extrae las últimas etiquetas y elimina todas las etiquetas eliminadas.


Muestra la diferencia entre etiquetas locales y remotas:

diff <(git tag | sort) <( git ls-remote --tags origin | cut -f2 | grep -v ''/^'' | sed ''s#refs/tags/##'' | sort)

  • git tag da la lista de etiquetas locales
  • git ls-remote --tags proporciona la lista de rutas completas a las etiquetas remotas
  • cut -f2 | grep -v ''/^'' | sed ''s#refs/tags/##'' cut -f2 | grep -v ''/^'' | sed ''s#refs/tags/##'' analiza solo el nombre de la etiqueta de la lista de rutas de etiquetas remotas
  • Finalmente ordenamos cada una de las dos listas y las diferenciamos.

Las 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, puede hacer más grep y tuberías para automatizarlo.


Si solo desea las etiquetas que existen en el control remoto, elimine todas sus etiquetas locales:

$ git tag -d $(git tag)

Y luego ir a buscar todas las etiquetas remotas:

$ git fetch --tags


Todas las versiones de Git desde v1.7.8 entienden git fetch con un refspec, mientras que desde --tags opción --tags anula la opción --prune . Para una solución de propósito general, intente esto:

$ git --version git version 2.1.3 $ git fetch --prune origin "+refs/tags/*:refs/tags/*" From ssh://xxx x [deleted] (none) -> rel_test

Para obtener más información sobre cómo cambió el comportamiento de "--tags" con "--prune" en Git v1.9.0, consulte: e66ef7ae6f31f2


TortoiseGit puede comparar etiquetas ahora.

El registro izquierdo está en el control remoto, la derecha está en local.

Usando la función Comparar etiquetas del cuadro de diálogo Sincronizar:

Ver también el número 2973 de TortoiseGit.


este es un buen método

git tag -l | xargs git tag -d && git fetch -t

Fuente: demisx.GitHub.io