Cómo cambiar los formattings de date de logging de git

Estoy tratando de mostrar el último compromiso dentro de git, pero necesito la date en un formatting especial.

Sé que el formatting de logging bonito %ad respeta el formatting de date, pero el único formatting de date que puedo encontrar es "corto". Quiero conocer a los demás y si puedo crear uno personalizado como:

 git -n 1 --date=**YYMMDDHHmm** --pretty=format:"Last committed item in this release was by %%an, %%aD, message: %%s(%%h)[%%d]" 

Los otros son (del git help log ):

 --date=(relative|local|default|iso|rfc|short|raw) Only takes effect for dates shown in human-readable format, such as when using "--pretty". log.date config variable sets a default value for log command's --date option. --date=relative shows dates relative to the current time, eg "2 hours ago". --date=local shows timestamps in user's local timezone. --date=iso (or --date=iso8601) shows timestamps in ISO 8601 format. --date=rfc (or --date=rfc2822) shows timestamps in RFC 2822 format, often found in E-mail messages. --date=short shows only date but not time, in YYYY-MM-DD format. --date=raw shows the date in the internal raw git format %s %z format. --date=default shows timestamps in the original timezone (either committer's or author's). 

No existe una forma integrada que sepa de crear un formatting personalizado, pero puedes hacer algo de magia de shell.

 timestamp=`git log -n1 --format="%at"` my_date=`perl -e "print scalar localtime ($timestamp)"` git log -n1 --pretty=format:"Blah-blah $my_date" 

El primer paso aquí te da una timestamp de milisegundos. Puede cambiar la segunda línea para formatear esa timestamp como lo desee. Este ejemplo le da algo similar a --date=local , con un día acolchado.


Y si desea un efecto permanente sin escribir esto cada vez, intente

 git config log.date iso 

O, para tener efecto en todo tu uso de git con esta count

 git config --global log.date iso 

Además de --date=(relative|local|default|iso|iso-strict|rfc|short|raw) , como otros han mencionado, también puede usar un formatting de date de logging personalizado con

 --date=format:'%Y-%m-%d %H:%M:%S' 

Esto produce algo como 2016-01-13 11:32:13 .

NOTA: Si echas un vistazo a la confirmación vinculada a continuación, creo que necesitarás al less Git v2.6.0-rc0 para que funcione.

No he podido encontrar esto en la documentation en ningún lugar (si alguien sabe dónde encontrarlo, por favor comenten), así que originalmente encontré los marcadores de position por testing y error.

En mi búsqueda de documentation sobre esto, encontré un compromiso con Git que indica que el formatting se alimenta directamente a strftime . Buscando el time strftime ( aquí o aquí ) los marcadores de position que encontré coinciden con los marcadores de position listdos. Los marcadores de position incluyen

 %a Abbreviated weekday name %A Full weekday name %b Abbreviated month name %B Full month name %c Date and time representation appropriate for locale %d Day of month as decimal number (01 – 31) %H Hour in 24-hour format (00 – 23) %I Hour in 12-hour format (01 – 12) %j Day of year as decimal number (001 – 366) %m Month as decimal number (01 – 12) %M Minute as decimal number (00 – 59) %p Current locale's AM/PM indicator for 12-hour clock %S Second as decimal number (00 – 59) %U Week of year as decimal number, with Sunday as first day of week (00 – 53) %w Weekday as decimal number (0 – 6; Sunday is 0) %W Week of year as decimal number, with Monday as first day of week (00 – 53) %x Date representation for current locale %X Time representation for current locale %y Year without century, as decimal number (00 – 99) %Y Year with century, as decimal number %z, %Z Either the time-zone name or time zone abbreviation, depending on registry settings; no characters if time zone is unknown %% Percent sign 

Después de un largo time buscando la forma de get la salida de git log la date en el formatting YYYY-MM-DD de una manera que funcionaría en less , se me ocurrió el siguiente formatting:

 %ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08 

junto con el interruptor --date=iso .

Esto imprimirá la date en formatting ISO (uno largo), y luego imprimirá 14 veces el carácter de retroceso (0x08), que, en mi terminal, elimina todo de manera efectiva después de la parte YYYY-MM-DD. Por ejemplo:

 git log --date=iso --pretty=format:'%ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%aN %s' 

Esto da algo como:

 2013-05-24 bruno This is the message of the latest commit. 2013-05-22 bruno This is an older commit. ... 

Lo que hice fue crear un alias llamado l con algunos ajustes en el formatting anterior. Muestra el gráfico de confirmación a la izquierda, luego el hash de confirmación, seguido de la date, los nombres cortos, los nombres y el tema. El alias es el siguiente (en ~ / .gitconfig):

 [alias] l = log --date-order --date=iso --graph --full-history --all --pretty=format:'%x08%x09%C(networking)%h %C(cyan)%ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08 %C(bold blue)%aN%C(reset)%C(bold yellow)%d %C(reset)%s' 

Puede utilizar la opción de truncamiento de campo para evitar tantos caracteres %x08 . Por ejemplo:

 git log --pretty='format:%h %s%n\t%<(12,trunc)%ci%x08%x08, %an <%ae>' 

es equivalente a:

 git log --pretty='format:%h %s%n\t%ci%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08, %an <%ae>' 

Y bastante más fácil para los ojos.

Mejor aún, para este ejemplo en particular, usar %cd respetará el --date=<format> , así que si quieres YYYY-MM-DD , puedes hacer esto y evitar %< y %x08 completo:

 git log --date=short --pretty='format:%h %s%n\t%cd, %an <%ae>' 

Me di count de que esto era un poco circular con respecto a la publicación original, pero lo dejo en caso de que otros llegaran aquí con los mismos parameters de búsqueda que yo.

Tenga en count el formatting " date=iso ": no es exactamente ISO 8601 .
Ver commit " 466fb67 " de Beat Bolli ( bbolli ) , para Git 2.2.0 (noviembre de 2014)

bonita: proporciona un formatting de date ISO 8601 estricto

El formatting de date "ISO" de Git no se ajusta al estándar ISO 8601 debido a pequeñas diferencias, y no puede ser analizado por analizadores ISO 8601, por ejemplo, los de cadenas de herramientas XML.

La salida de " --date=iso " se desvía de ISO 8601 de estas maneras:

  • un espacio en lugar del delimitador de date / hora T
  • un espacio entre el time y la zona horaria
  • sin puntos entre las horas y los minutos de la zona horaria

Agregue un formatting de date ISO 8601 estricto para mostrar dates de committer y autor.
Utilice los especificadores de formatting ' %aI ' y ' %cI ' y agregue los nombres de formatting de date ' --date=iso-strict ' o ' --date=iso8601-strict '.

Vea este hilo para discusión.

 date -d @$(git log -n1 --format="%at") +%Y%m%d%H%M 

Tenga en count que esto se convertirá a su zona horaria local, en caso de que sea importante para su caso de uso.

la opción de formatting %ai era lo que quería.

%ai : date de autor, formatting ISO 8601

 --format="%ai" 

Tenía la necesidad de hacer lo mismo y me pareció que funcionaba lo siguiente:

 git log -n 1 --pretty='format:%cd' --date=format:'%Y-%m-%d %H:%M:%S' 

El formatting –date = formatea el resultado de la date donde el --pretty dice qué imprimir.

 git log -n1 --format="Last committed item in this release was by %an, `git log -n1 --format=%at | awk '{print strftime("%y%m%d%H%M",$1)}'`, message: %s (%h) [%d]" 

Utilice bash y el command de date para convertir del formatting similar al ISO al que desee. Quería un formatting de date de org-modo (y un elemento de list), así que hice esto

 echo + [$(date -d "$(git log --pretty=format:%ai -1)" +"%Y-%m-%d %a %H:%M")] \ $(git log --pretty=format:"%h %s" --abbrev=12 -1) 

y el resultado es, por ejemplo,

 + [2015-09-13 Sun 22:44] 2b0ad02e6cec Merge pull request #72 from 3b/bug-1474631 

Git 2.7 (Q4 2015) introducirá -local como una instrucción.
Significa que, además de:

 --date=(relative|local|default|iso|iso-strict|rfc|short|raw) 

también tendrás:

 --date=(default-local|iso-local|iso-strict-local|rfc-local|short-local) 

El sufijo -local no se puede usar con datos raw o relative . Referencia .

Ahora puede solicitar cualquier formatting de date usando la zona horaria local . Ver

  • cometer 99264e9 ,
  • cometer db7bae2 ,
  • cometer dc6d782 ,
  • cometer f3c1ba5 ,
  • cometer f95cecf ,
  • cometer 4b1c5e1 ,
  • cometer 8f50d26 ,
  • cometer 78a8441 ,
  • commit 2df4e29 (03 Sep 2015) por John Keeping ( johnkeeping ) .

Ver commit add00ba , commit 547ed71 (03 Sep 2015) por Jeff King ( peff ) .
(Fusionado por Junio ​​C Hamano – gitster – in commit 7b09c45 , 05 de octubre de 2015)

En particular, el último de arriba (commit add00ba) menciona:

date : hacer el formatting " local " ortogonal a la date:

La mayoría de nuestros modos "- --date " son sobre el formatting de la date: qué elementos mostramos y en qué order.
Pero " --date=local " es un poco raro. Significa "mostrar la date en el formatting normal, pero utilizando la zona horaria local".
La zona horaria que utilizamos es ortogonal al formatting real, y no hay ninguna razón por la que no podamos tener "iso8601 localizado", etc.

Este parche agrega un campo boolean " local " a " struct date_mode ", y descarta el elemento DATE_LOCAL del tipo date_mode_type (ahora es DATE_NORMAL más local=1 ).
La nueva característica es accesible para los usuarios agregando " -local " a cualquier modo de date (p. Ej., " iso-local "), y retenemos " local " como alias para " default-local " para compatibilidad con versiones anteriores.