tag publicar crear agregar git shell text-processing git-log text-manipulation

publicar - ¿Cómo obtener el registro de Git con estadísticas cortas en una línea?



git-- tags (6)

El siguiente comando da salida a las líneas de texto en la consola

git log --pretty=format:"%h;%ai;%s" --shortstat ed6e0ab;2014-01-07 16:32:39 +0530;Foo 3 files changed, 14 insertions(+), 13 deletions(-) cdfbb10;2014-01-07 14:59:48 +0530;Bar 1 file changed, 21 insertions(+) 5fde3e1;2014-01-06 17:26:40 +0530;Merge Baz 772b277;2014-01-06 17:09:42 +0530;Qux 7 files changed, 72 insertions(+), 7 deletions(-)

Estoy interesado en tener el formato de arriba para ser mostrado como este

ed6e0ab;2014-01-07 16:32:39 +0530;Foo;3;14;13 cdfbb10;2014-01-07 14:59:48 +0530;Bar;1;21;0 5fde3e1;2014-01-06 17:26:40 +0530;Merge Baz;0;0;0 772b277;2014-01-06 17:09:42 +0530;Qux;7;72;7

Esto se consumirá en algún informe que puede analizar valores separados por punto y coma. La cosa es el texto "/n 3 files changed, 14 insertions(+), 13 deletions(-)" (nueva línea incluida) se convierte a 3;14;13 (sin nueva línea) Un posible caso de esquina es un texto como "5fde3e1;2014-01-06 17:26:40 +0530;Merge Baz" que no tiene esa línea. En ese caso quiero ;0;0;0

En general, el objetivo es analizar las estadísticas de cambio de archivos durante un período de tiempo. Leí la documentación de registro de git pero no pude encontrar ningún formato que me ayude a renderizar en este formato. Lo mejor que se me ocurrió fue el comando mencionado anteriormente.

Por lo tanto, cualquier comando o script de shell que pueda generar el formato esperado sería de gran ayuda.

¡Gracias!


Desafortunadamente, esto es imposible de lograr usando solo el git log . Uno tiene que usar otros scripts para compensar algo de lo que la mayoría de las personas no están al tanto: algunas confirmaciones no tienen estadísticas , incluso si no están fusionadas.

He estado trabajando en un proyecto que convierte git log a JSON y para hacerlo, tuve que hacer lo que necesitas: obtener cada confirmación, con estadísticas, en una línea. El proyecto se llama Gitlogg y puede modificarlo según sus necesidades: https://github.com/dreamyguy/gitlogg

A continuación se muestra la parte relevante de Gitlogg , que te acercará a lo que te gustaría:

git log --all --no-merges --shortstat --reverse --pretty=format:''commits/tcommit_hash/t%H/tcommit_hash_abbreviated/t%h/ttree_hash/t%T/ttree_hash_abbreviated/t%t/tparent_hashes/t%P/tparent_hashes_abbreviated/t%p/tauthor_name/t%an/tauthor_name_mailmap/t%aN/tauthor_email/t%ae/tauthor_email_mailmap/t%aE/tauthor_date/t%ad/tauthor_date_RFC2822/t%aD/tauthor_date_relative/t%ar/tauthor_date_unix_timestamp/t%at/tauthor_date_iso_8601/t%ai/tauthor_date_iso_8601_strict/t%aI/tcommitter_name/t%cn/tcommitter_name_mailmap/t%cN/tcommitter_email/t%ce/tcommitter_email_mailmap/t%cE/tcommitter_date/t%cd/tcommitter_date_RFC2822/t%cD/tcommitter_date_relative/t%cr/tcommitter_date_unix_timestamp/t%ct/tcommitter_date_iso_8601/t%ci/tcommitter_date_iso_8601_strict/t%cI/tref_names/t%d/tref_names_no_wrapping/t%D/tencoding/t%e/tsubject/t%s/tsubject_sanitized/t%f/tcommit_notes/t%N/tstats/t'' | sed ''/^[ /t]*$/d'' | # remove all newlines/line-breaks, including those with empty spaces tr ''/n'' ''ò'' | # convert newlines/line-breaks to a character, so we can manipulate it without much trouble tr ''/r'' ''ò'' | # convert carriage returns to a character, so we can manipulate it without much trouble sed ''s/tòcommits/tòòcommits/g'' | # because some commits have no stats, we have to create an extra line-break to make `paste -d '' '' - -` consistent tr ''ò'' ''/n'' | # bring back all line-breaks sed ''{ N s/[)]/n/ncommits/)/ commits/g }'' | # some rogue mystical line-breaks need to go down to their knees and beg for mercy, which they''re not getting paste -d '' '' - - # collapse lines so that the `shortstat` is merged with the rest of the commit data, on a single line

Tenga en cuenta que he usado el carácter de tabulación ( /t ) para separar campos como ; Podría haber sido utilizado en el mensaje de confirmación.

Otra parte importante de este script es que cada línea debe comenzar con una cadena única (en este caso, se confirma ). Eso es porque nuestro guión necesita saber dónde comienza la línea. De hecho, lo que venga después del comando git log está ahí para compensar el hecho de que algunas confirmaciones pueden no tener estadísticas .

Pero me sorprende que lo que quiere lograr es que los envíos se realicen de forma ordenada en un formato que pueda consumir de manera confiable. Gitlogg es perfecto para eso! Algunas de sus características son:

  • Analice el git log de varios repositorios en un archivo JSON .
  • Se introdujo la clave / valor del repository .
  • Se introdujeron files changed , insertions y deletions claves / valores.
  • Se introdujo la clave / valor de impact , que representa los cambios acumulativos para la confirmación ( insertions - deletions ).
  • Desinfecte las comillas dobles " al convertirlas en comillas simples '' en todos los valores que permiten o son creados por la entrada del usuario, como subject .
  • Casi todo el pretty=format: marcadores de posición están disponibles.
  • Incluya / excluya fácilmente qué claves / valores se analizarán a JSON comentando / descomentando los disponibles.
  • Código fácil de leer que está completamente comentado.
  • Comentarios de ejecución de script en consola.
  • Manejo de errores (ya que la ruta a los repositorios debe configurarse correctamente).

Éxito, el JSON fue analizado y guardado.

Error 001: la ruta a los repositorios no existe.

Error 002: la ruta a los repositorios existe, pero está vacía.


Este es un enfoque con awk .

awk ''BEGIN{FS="[,;]"; OFS=";"} /;/ {a=$0} /^ /{gsub(/[a-z(+-) ]/,"") gsub(",",";"); print a,$0}''

Para la entrada dada devuelve:

ed6e0ab;2014-01-07 16:32:39 +0530;Foo;3;14;13 cdfbb10;2014-01-07 14:59:48 +0530;Bar;1;21 772b277;2014-01-06 17:09:42 +0530;Qux;7;72;7

Aún no funciona para líneas como 5fde3e1;2014-01-06 17:26:40 +0530;Merge Baz que no tiene 3 files changed, 14 insertions(+), 13 deletions(-) después.


Puse algo como esto en mi ~/.bashrc :

function git-lgs() { git --no-pager log --numstat --format=%ai "$1" | sed '':a;N;$!ba;s//n/n//t/g'' | sed ''s//(/t[0-9]*/t*[0-9]*/).*//1/'' }

Donde el argumento de git-lgs es el nombre de archivo para el que desea visualizar el registro.


Siguiendo @ user2461539 para analizarlo en columnas. Funciona con cols más complejos como "Asunto" también. Hackea para elegir tus propios delimitadores adecuados. Actualmente es necesario cortar la línea de asunto, ya que truncará otras columnas cuando se desborde.

#!/bin/bash # assumes "_Z_Z_Z_" and "_Y_Y_" "_X_X_" as unused characters # Truncate subject line sanitized (%f) or not (%s) to 79 %<(79,trunc)%f echo commit,author_name,time_sec,subject,files_changed,lines_inserted,lines_deleted>../tensorflow_log.csv; git log --oneline --pretty="_Z_Z_Z_%h_Y_Y_/"%an/"_Y_Y_%at_Y_Y_/"%<(79,trunc)%f/"_Y_Y__X_X_" --stat / | grep -v /| / | sed -E ''s/@//g'' / | sed -E ''s/_Z_Z_Z_/@/g'' / | tr "/n" " " / | tr "@" "/n" |sed -E ''s/,//g'' / | sed -E ''s/_Y_Y_/, /g'' / | sed -E ''s/(changed [0-9].*/+/))/,/1,/'' / | sed -E ''s/(changed [0-9]* deleti.*-/)) /,,/1/'' / | sed -E ''s/insertion.*/+/)//g'' / | sed -E ''s/deletion.*/-/)//g'' / | sed -E ''s/,changed/,/'' / | sed -E ''s/files? ,/,/g'' / | sed -E ''s/_X_X_ $/,,/g'' / | sed -E ''s/_X_X_//g''>>../tensorflow_log.csv


git no admite información estadística con formato simple, que es una vergüenza :( pero es fácil de escribir, esta es mi solución rápida y sucia, debería ser bastante legible:

#!/bin/bash format_log_entry () { read commit read date read summary local statnum=0 local add=0 local rem=0 while true; do read statline if [ -z "$statline" ]; then break; fi ((statnum += 1)) ((add += $(echo $statline | cut -d'' '' -f1))) ((rem += $(echo $statline | cut -d'' '' -f2))) done if [ -n "$commit" ]; then echo "$commit;$date;$summary;$statnum;$add;$rem" else exit 0 fi } while true; do format_log_entry done

Estoy seguro de que se puede escribir mejor, pero bueno, es rápido y sucio;)

uso:

$ git log --pretty=format:"%h%n%ai%n%s" --numstat | ./script

Tenga en cuenta que el formato que especificó no es a prueba de balas. El punto y coma puede aparecer en el resumen de confirmación, que dividirá el número de campos en dicha línea; puede mover el resumen al final de la línea o escapar de alguna manera: ¿cómo desea hacerlo?


git log --oneline --pretty="@%h" --stat |grep -v /| | tr "/n" " " | tr "@" "/n"

Esto mostrará algo como esto:

a596f1e 1 file changed, 6 insertions(+), 3 deletions(-) 4a9a4a1 1 file changed, 6 deletions(-) b8325fd 1 file changed, 65 insertions(+), 4 deletions(-) 968ef81 1 file changed, 4 insertions(+), 5 deletions(-)