mostrar todas las etiquetas en el registro de git

8 minutos de lectura

avatar de usuario
jonathan

Por que git log --decorate no mostrar más de una etiqueta por confirmación?

EDITAR: Charles Bailey ha dado con la respuesta (al menos en mi caso)
Esencialmente, tenía una etiqueta que apuntaba a otra etiqueta que apuntaba a la confirmación. Debido a esta capa adicional de direccionamiento indirecto, la etiqueta no aparecía en el registro. Tendré que arreglar esto, marchitar arreglando nuestra secuencia de comandos de etiquetado para etiquetar correctamente, o mediante algún script de shell vudú para seguir las etiquetas recursivamente. De todos modos, dejaré esta pregunta solo como referencia en caso de que alguien la quiera. (Soy nuevo en el desbordamiento de pila, pero supongo que ese es el protocolo correcto).

… La pregunta original sigue …

Trasfondo: usamos GIT en el trabajo para el control de código fuente, y tenemos una política de etiquetar siempre una confirmación cuando implementamos. (En realidad, es un script que hace etiquetas y luego extrae la etiqueta en el servidor). Dado que es una aplicación web con servidores de ensayo y producción independientes, a menudo etiquetamos una versión para ensayo (para pruebas o lo que sea) y luego etiquetamos la misma confirmación para producción.

Entonces, en realidad, es muy frecuente que tengamos varias etiquetas en el mismo compromiso. Sería muy bueno poder ver esto en el registro de texto, pero no parece admitirlo. Actualmente estoy solucionando el problema comprobando manualmente la etiqueta que estoy buscando o activando gitk. Si bien ambas soluciones funcionan, me parece que es realmente extraño para git log --decorate para admitir solo una etiqueta por confirmación de forma predeterminada.

Busqué un poco en Google, pero no encontré mucho. ¿Me estoy perdiendo algo obvio?

PD (en realidad uso una cadena de formato personalizado con %dsegún las páginas del manual y algunas pruebas rápidas, es equivalente a --decorate)

  • ¿Has probado ‘git log –decorate=full’ (menos comillas)?

    – RDL

    18 de noviembre de 2010 a las 4:15

  • ¿Qué versión de git estás usando? Veo varias etiquetas muy bien en la mía.

    – Cascabel

    18 de noviembre de 2010 a las 4:15

  • @RDL: full hace que imprima refs/heads/ o refs/tags/ según corresponda, ¿verdad? Ni más ni menos refs.

    – Cascabel

    18 de noviembre de 2010 a las 4:16

  • Pregunta rápida, ¿etiquetas las etiquetas o etiquetas el compromiso? (Las etiquetas pueden formar cadenas, en mis pruebas, decoran las etiquetas que apuntan a una confirmación y las etiquetas que apuntan a una etiqueta a una confirmación, pero no más allá de eso).

    –CB Bailey

    18 de noviembre de 2010 a las 9:21

  • @Charles Bailey Creo que puede haber localizado el problema. Intenté una prueba simple en el trabajo (git versión 1.6.3.3) y parece funcionar bien. Así que no es un problema de versión. Investigaré más luego. ¡Gracias por la información!

    – Jonathan

    18 de noviembre de 2010 a las 15:26

git log --no-walk --tags --pretty="%h %d %s" --decorate=full

Esta versión también imprimirá el mensaje de confirmación:

 $ git log --no-walk --tags --pretty="%h %d %s" --decorate=full
3713f3f  (tag: refs/tags/1.0.0, tag: refs/tags/0.6.0, refs/remotes/origin/master, refs/heads/master) SP-144/ISP-177: Updating the package.json with 0.6.0 version and the README.md.
00a3762  (tag: refs/tags/0.5.0) ISP-144/ISP-205: Update logger to save files with optional port number if defined/passed: Version 0.5.0
d8db998  (tag: refs/tags/0.4.2) ISP-141/ISP-184/ISP-187: Fixing the bug when loading the app with Gulp and Grunt for 0.4.2
3652484  (tag: refs/tags/0.4.1) ISP-141/ISP-184: Missing the package.json and README.md updates with the 0.4.1 version
c55eee7  (tag: refs/tags/0.4.0) ISP-141/ISP-184/ISP-187: Updating the README.md file with the latest 1.3.0 version.
6963d0b  (tag: refs/tags/0.3.0) ISP-141/ISP-184: Add support for custom serializers: README update
4afdbbe  (tag: refs/tags/0.2.0) ISP-141/ISP-143/ISP-144: Fixing a bug with the creation of the logs
e1513f1  (tag: refs/tags/0.1.0) ISP-141/ISP-143: Betterr refactoring of the Loggers, no dependencies, self-configuration for missing settings.

  • Incluso mejor creando un alias para él 🙂 git config –global alias.tags “!git log –no-walk –tags –pretty=’%h %d %s’ –decorate=full”

    – GOXR3PLUS

    5 de noviembre de 2018 a las 8:59

  • Gracias @GOXR3PLUS. Tuve que hacer: git config –global alias.tags “log –no-walk –tags –pretty=’%h %d %s’ –decorate=full”

    – ajh158

    10 de enero de 2019 a las 23:04


  • Me gusta mucho ver la salida en color y ver más detalles de la git log info, así que he agregado mi propia respuesta con cómo hacerlo aquí.

    – Gabriel grapas

    21/09/2021 a las 21:14


avatar de usuario
VonC

Tenga en cuenta sobre la etiqueta de la etiqueta (etiquetar una etiqueta), que está en el origen de su problema, como señaló correctamente Charles Bailey en el comentario:

Asegúrate de estudiar este hiloya que anular una etiqueta firmada no es tan fácil:

  • si ya envió una etiqueta, el git tag página man seriamente desaconsejado un simple git tag -f B para reemplazar el nombre de una etiqueta “A
  • no intente recrear una etiqueta firmada con git tag -f (ver el extracto del hilo a continuación)

    (Se trata de un caso de esquina, pero bastante instructivo sobre las etiquetas en general, y proviene de otro colaborador de SO, Jakub Narębski):

Tenga en cuenta que el nombre de la etiqueta (etiqueta de peso pesado, es decir, objeto de etiqueta) se almacena en dos lugares:

  • en el objeto de etiqueta como contenido del encabezado ‘etiqueta’ (puede verlo en la salida de “git show <tag>” y también en la salida de “git cat-file -p <tag>“, donde <tag> es una etiqueta de peso pesado, por ejemplo v1.6.3 en git.git repositorio),
  • y también es el nombre predeterminado de la referencia de la etiqueta (referencia en “refs/tags/*” espacio de nombres) apuntando a un objeto de etiqueta.
    Tenga en cuenta que la etiqueta referencia (referencia apropiada en el “refs/tags/*“espacio de nombres) es puramente local importar; lo que un repositorio tiene en ‘refs/tags/v0.1.3‘, otros pueden tener en ‘refs/tags/sub/v0.1.3‘ por ejemplo.

Entonces, cuando creas una etiqueta firmada ‘A‘, tienes la siguiente situación (asumiendo que apunta a algún compromiso)

  35805ce   <--- 5b7b4ead  <=== refs/tags/A
  (commit)       tag A
                 (tag)

Tenga en cuenta también que “git tag -f A A“(observe la ausencia de opciones que obligan a que sea una etiqueta anotada) es un noop, no cambia la situación.

Si lo haces “git tag -f -s A A“: tenga en cuenta que usted fuerza owerescribiendo una etiqueta (por lo que git asume que sabes lo que estás haciendo), y que uno de -s / -a / -m options se usa para forzar una etiqueta anotada (creación de un objeto de etiqueta), obtendrá la siguiente situación

  35805ce   <--- 5b7b4ea  <--- ada8ddc  <=== refs/tags/A
  (commit)       tag A         tag A
                 (tag)         (tag)

Tenga en cuenta también que “git show A” mostraría toda la cadena hasta el objeto sin etiqueta…

Nota la cometer 5e1361c desde brian m. Carlson (bk2204) (para git 1.9/2.0 Q1 2014) trata un caso especial en términos de decoración de registros con etiquetas:

registro: maneje correctamente las decoraciones con etiquetas encadenadas

git log no manejó correctamente las decoraciones cuando un objeto de etiqueta hacía referencia a otro objeto de etiqueta que ya no era una referencia, como cuando se eliminó la segunda etiqueta.
La confirmación no estaría decorada correctamente porque parse_object no se había invocado en la segunda etiqueta y, por lo tanto, su campo etiquetado no se había completado, lo que resultó en que ninguna de las etiquetas se asoció con la confirmación relevante.

Llamada parse_object para completar este campo si está ausente para que la cadena de etiquetas se pueda desreferenciar y la confirmación se pueda decorar correctamente.
Incluya también pruebas para evitar futuras regresiones.

Ejemplo:

git tag -a tag1 -m tag1 &&
git tag -a tag2 -m tag2 tag1 &&
git tag -d tag1 &&
git commit --amend -m shorter &&
git log --no-walk --tags --pretty="%H %d" --decorate=full

avatar de usuario
grapas gabriel

Nota: solo me refiero a la tema de la pregunta:

mostrar todas las etiquetas en el registro de git

no los detalles específicos de la pregunta.

mostrar el completo git log (¡en color!) para cada confirmación etiquetada:

Realmente creo que esta es la forma más útil y hermosa:

git log --no-walk --tags

muestra el completo git log salida para cada confirmación que tiene una etiqueta adjunta. ¡Muy útil!

Y si desea filtrar solo las etiquetas que coinciden con un determinado patrón de búsqueda de cadenas, haga esto en su lugar:

git log --no-walk --tags=*some_string*

Ejemplo:

git log --no-walk --tags=*release/my_board*

Mostrar una línea git log resumen (¡en color!) para cada confirmación etiquetada:

Si desea ver solo una línea por confirmación etiquetada, haga esto en su lugar. Nota: esto se modifica de Coderwall es hermoso git lg alias:

git log --color --no-walk --tags --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

Y, por supuesto, aún puede filtrar solo ciertas etiquetas que desee utilizando el --tags=*some_string* formulario en su lugar:

git log --color --no-walk --tags=*some_string* --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

Ejemplo:

git log --color --no-walk --tags=*release/my_board* --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

Referencias:

  1. La respuesta de @Marcello de Sales me ayudó a empezar.
  2. Coderwall es hermoso git lg alias

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad