¿Cómo puedo decorar un logging de git con su label más cercana?

git log --decorate agrega información sobre references relacionadas al resultado del logging:

 commit 9e895ace5d82df8929b16f58e9f515f6d54ab82d (tag: v3.10-rc7) Author: Linus Torvalds <torvalds@linux-foundation.org> Date: Sat Jun 22 09:47:31 2013 -1000 Linux 3.10-rc7 

Esta información ayuda a rastrear qué label (o twig) contiene esta confirmación. Al ver un set restringido de files (por ejemplo, un subdirectory), no tiene que haber una label para esas confirmaciones. ¿Hay alguna manera de poner una reference a una label en el resultado del logging?

Anteriormente mencioné git describe , pero eso produce v3.10-rc7-135-g98b6ed0 que es relativo a una label de twig donde se cometió este cambio. Lo que estoy buscando es un nombre de label entre commits.

Para mayor claridad, esta es la situación actual:

 $ git log --decorate --oneline 98b6ed0 (HEAD, origin/master, master) Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 1a506e4 Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux 578a131 dlci: validate the net device in dlci_del() 11eb264 dlci: acquire rtnl_lock before calling __dev_get_by_name() ... 9e895ac (tag: v3.10-rc7) Linux 3.10-rc7 

Lo que quiero tener es algo así como:

 98b6ed0 (v3.10-rc7+, HEAD, origin/master, master) Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net 1a506e4 (v3.10-rc7+) Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux 578a131 (v3.10-rc7+) dlci: validate the net device in dlci_del() 11eb264 (v3.10-rc7+) dlci: acquire rtnl_lock before calling __dev_get_by_name() ... 9e895ac (tag: v3.10-rc7) Linux 3.10-rc7 

El uso de la salida de git describe lugar del hash de confirmación mostraría algo así como:

 $ git log --decorate --oneline -n4 | awk '{system("git describe " $1 " |tr -d '\''\n'\''");$1="";print}' v3.10-rc7-135-g98b6ed0 (HEAD, origin/master, master) Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net v3.10-rc7-54-g1a506e4 Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux v3.10-rc6-81-g578a131 dlci: validate the net device in dlci_del() v3.10-rc6-80-g11eb264 dlci: acquire rtnl_lock before calling __dev_get_by_name() ... v3.10-rc7 (tag: v3.10-rc7) Linux 3.10-rc7 

Como puede ver, los nombres de label más antiguos se utilizan como punto de reference en lugar del punto donde se fusionó la confirmación. Por ejemplo, estoy usando git log --oneline aquí, pero en realidad quiero usar un resultado más completo, por ejemplo, git log -p --stat .

El parámetro " --first-parent " de git describe (introducido con git 1.8.4) muestra de dónde se deriva un commit. Para ver una relación con la primera label después de la confirmación , use git describe --contains . Sin embargo, esta opción se vuelve muy lenta (~ 6 segundos) cuando profundizas en la historia. Disponible desde git 1.5.3.

El command git name-rev se puede utilizar para anotar git rev-name y funciona con --graph y --color también! De su página de manual:

Dado un compromiso, averigua dónde está relacionado con los refs locales. Digamos que alguien le escribió sobre esa fantástica confirmación 33db5f4d9027a10e477ccf054b2c1ab94f74c85a. Por supuesto, observas el compromiso, pero eso solo te dice lo que sucedió, pero no el context.

Ingrese git name-rev :

 % git name-rev 33db5f4d9027a10e477ccf054b2c1ab94f74c85a 33db5f4d9027a10e477ccf054b2c1ab94f74c85a tags/v0.99~940 

Ahora eres más sabio, porque sabes que sucedieron 940 revisiones antes de v0.99.

Otra cosa buena que puedes hacer es:

 % git log | git name-rev --stdin 

Este último command agrega algo a cada hash SHA-1 de 40 caracteres como se muestra a continuación (la parte resaltada se agrega por git name-rev ).

 commit 1ee2dcc2245340cf4ac94b99c4d00efbeba61824 (tags / v3.13-rc1 ~ 33)
 Fusionar: 4457e6f 091e066
 Autor: Linus Torvalds

     Fusionar git: //git.kernel.org/pub/scm/linux/kernel/git/davem/net

 commit b4089d6d8e71a7293e2192025dfa507a04f661c4 (tags / v3.13-rc1 ~ 7 ^ 2 ~ 6 ^ 2 ^ 2 ~ 8)
 Autor: Felix Fietkau

     rt2x00: soluciona un error de locking en el arreglo de event handlingl descriptor HT
 ...
 commit dfb6b7c109a7f98d324a759599d1b4616f02c79f (tags / v3.12-rc7 ~ 20 ^ 2 ~ 20 ^ 2 ^ 2 ~ 11)
 Autor: Stanislaw Gruszka
 Fecha: Lun 23 de septiembre 04:08:13 2013 +0200

     Revertir "rt2x00pci: Usar PCI MSI siempre que sea posible"

     Esto revierte commit 9483f40d8d01918b399b4e24d0c1111db0afffeb (tags / v3.11-rc1 ~ 16 ^ 2 ~ 103 ^ 2 ^ 2 ~ 111) .

En https://git.lekensteyn.nl/scripts/tree/git-log-describe.awk (escrito antes de que supiera de git rev-name ) está disponible una secuencia de commands awk para la salida de git log posterior al procesamiento. caracteristicas:

  • Considera el hash de commit <hash> lugar de commit <hash> de 40 caracteres (funciona también con --abbrev-commit ).
  • Soporte para el formatting de git log --graph .
  • Agrega git describe --contains o git describe --first-parent .
  • Posibilidad de especificar un directory de caching para ahorrar time más tarde.

Como puede ver, los nombres de label más antiguos se utilizan como punto de reference en lugar del punto donde se fusionó la confirmación.

Eso debería ser posible … pronto (git 1.8.4 de julio de 2013):

Consulte commit e00dd1e9485c50f202cc97dfae19d510e108b565 :

 describe: Add --first-parent option 

Solo considere la primera confirmación principal al recorrer el historial de compromisos.
Esto es útil si solo desea hacer coincidir las tags en su twig después de una fusión.


OP Lekensteyn lo comenta ( --first-parent ) no es suficiente:

--first-parent no muestra la label donde se fusionó también.
Acabo de descubrir que --contains se pueden usar para eso.
Ver mi respuesta para una solución aún mejor, git name-rev .

Nota: git name-rev data de git0.99.9 (octubre de 2005) .