2012-08-31 14 views
18

¿Cómo se enumera el nombre de la etiqueta, la fecha de la etiqueta y el mensaje de la etiqueta para todas las etiquetas?Lista de nombres, fechas y mensajes de etiquetas git

Parece que la separación de git de la lógica de visualización para commits a través de git log y etiquetas a través de git tag hace que sea difícil enumerar el nombre de la etiqueta, la fecha de la etiqueta y el mensaje de la etiqueta.

que puede mostrar la fecha de la etiqueta, el nombre y el mensaje del informe usando git log --tags --show-notes --simplify-by-decoration --pretty="format:%ai %d %s"

inspeccioné http://opensource.apple.com/source/Git/Git-26/src/git-htmldocs/pretty-formats.txt pero no vi ninguna opción para mostrar el mensaje de la etiqueta.

Puedo mostrar el nombre de la etiqueta y 5 líneas de etiqueta mensaje usando git tag -n5.

Pero para obtener las tres piezas de información parece que se requieren secuencias de comandos gnarly más allá de mi capacidad.

Respuesta

4

git show --tags al menos generará toda la información relevante sobre sus etiquetas. Es posible que pueda encontrar una secuencia --pretty=format: apropiada desde allí.

+7

Esto parece ser una manera muy complicada de decir 'git show de --tags', que por cierto no parecen tener un formato para lo la pregunta que el autor necesita –

+0

@ MichałPolitowski Ah yep. 'git show --tags' hará lo mismo. Editando la respuesta en consecuencia. – Christopher

0

No sé si hay una manera de

lista solamente el nombre de la etiqueta, la fecha de la etiqueta y el mensaje de etiqueta para todas las etiquetas usando sólo la sintaxis git.

Sin embargo, un grep sencilla hará el trabajo:

git show --tags |grep "^tag " -A4

Aviso especifico 4 líneas de contexto posterior después de contrastar, debido a que la salida estándar muestra etiqueta con su nombre, fecha de la etiqueta y el mensaje etiqueta de cada uno de una línea separada.

Si usted necesita para hacer frente a los mensajes con etiquetas de varias líneas yo preferiría usar la tubería a awk que es un poco más complicado:

git show --tags |awk "/^tag /,/-----BEGIN PGP SIGNATURE-----|commit /" |egrep -v "^$" |sed -E "s/^-----BEGIN PGP SIGNATURE-----.*|^commit.*/-/"

Esto funcionará siempre y cuando el mensaje de la etiqueta es seguido ya sea por el PGP FIRMA o el mensaje de confirmación, que son todas las situaciones posibles. Sin embargo, puede adaptar fácilmente el último grep para cubrir otras situaciones (si las hubiera).

+0

Creé mi etiqueta con la función Liberaciones de Github utilizando su nombre de etiqueta creado automáticamente (el mensaje de confirmación). En ese repositorio, el comando anterior no funciona, no obtengo ningún resultado del grep y toneladas de resultados inútiles de la demostración de git --tags. ¡Gracias por la idea! – AnneTheAgile

18

Desea utilizar el comando for-each-ref. Desafortunadamente, es solo un poco menos amigable que filter-branch

Tenga en cuenta que la información como la fecha de la etiqueta y el etiquetador solo está disponible para las etiquetas anotadas.

A continuación se muestra un prototipo básico. Tenga en cuenta que el formato = puede ser un script de shell completo por sí mismo, y probablemente debería depender de cuán complicado sea el resultado. Tienen un par de ejemplos específicamente para etiquetas in the for-each-ref documentation

git for-each-ref --format="%(refname:short) %(taggerdate) %(subject) %(body)" refs/tags 
+0

Con una etiqueta creada a través de releases de Github con el nombre de etiqueta autogenerado, muestra el mensaje de confirmación de la confirmación relacionada, no el mensaje de la etiqueta que se escribió en la GUI. Eso me indica que Github no está usando git tag -a sino algún otro método? – AnneTheAgile

+0

Parece una etiqueta no anotada. Esos solo almacenan un puntero al SHA. –

+0

no parece ser compatible con las opciones de formato git-log, como% <(N) para la salida tabular –

0

Esto es más bien una pregunta de seguimiento a Andrew's respuesta, ligeramente tema diferente pero relacionado.

git for-each-ref --format="%(refname:short) %(taggerdate) %(subject) %(body)" refs/tags

Esto funciona muy bien en la línea de mando directo. Cuando configuro un alias git en ~/.gitconfig, no parece arrojar el mismo resultado.

Cuando lo invoco directamente en la línea de comandos, obtengo.

paquete-release-14.7.2 Wed Dec 3 14:24:38 2014 -0800 14.7.2: copiar para la etiqueta paquete-release-14.7.2
paquete-release-14.7.3 Thu Dec 4 14: 14:55 2014 -0800 14.7.3: copia para la etiqueta paquete-release-14.7.3
paquete-release-14.7.4 vie dic 5 16:16:40 2014 -0800 14.7.4: copia para etiqueta paquete-lanzamiento -14.7.4

Y cuando invoco un git alias (taghist = for-each-ref --format = "% (refname: short)% (taggerdate)% (subject)% (body)" refs/tags), Obtengo

paquete-lanzamiento-14.7.2
paquete-lanzamiento-14.7 0.3
paquete-release-14.7.4

-San

+1

Use \ "en lugar de", luego edítelo para proporcionar una respuesta sobre cómo hacerlo en un alias ya que de lo contrario no lo es t una respuesta –

+0

taghist = for-each-ref --format = \ "% (refname: short)% (taggerdate)% (subject)% (body) \" refs/tags – San

Cuestiones relacionadas