Cómo cambiar los formatos de fecha de registro de Git

150

Estoy tratando de mostrar la última confirmación dentro de Git, pero necesito la fecha en un formato especial.

Sé que el formato bonito de registro %adrespeta el --dateformato, pero el único --dateformato 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]"
ar3
fuente
1
Siempre encuentro que la documentación oficial de Linux Kernel Git es un excelente recurso para este tipo de preguntas.
2
Nota: ahora (noviembre de 2014, Git 2.2) tiene --date=iso-strict: vea mi respuesta a continuación
VonC
44
¡Con git 2.7 (cuarto trimestre de 2015), puede solicitar el uso de la zona horaria local para cualquier formato de fecha! Vea mi respuesta a continuación . Significa que, además de --date=(relative|local|default|iso|iso-strict|rfc|short|raw), también tendrá:--date=(relative-local|default-local|iso-local|iso-strict-local|rfc-local|short-local|raw-local)
VonC

Respuestas:

167

Los otros son (de 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, e.g. "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 conozco ninguna forma integrada de crear un formato 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 marca de tiempo de milisegundos. Puede cambiar la segunda línea para formatear esa marca de tiempo 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 su uso de git con esta cuenta

git config --global log.date iso
dmedvinsky
fuente
15
Y si desea un efecto permanente sin tener que escribir esto cada vez, pruebe algo como git config log.date isoo, para tener efecto en todo su uso de git con esta cuentagit config --global log.date iso
Stéphane Gourichon
12
Puedes usar tus propios formatos. ver la respuesta de Ben Allred . --format:<args>pasará <args>al medio tiempo.
Capitán Man
190

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

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

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

NOTA: Si echa un vistazo a la confirmación vinculada a continuación, creo que necesitará al menos Git v2.6.0-rc0para que esto funcione.

En un comando completo sería algo como:

git config --global alias.lg "log --graph --decorate 
-30 --all --date-order --date=format:'%Y-%m-%d %H:%M:%S' 
--pretty=format:'%C(cyan)%h%Creset %C(black bold)%ad%Creset%C(auto)%d %s'" 

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

En mi búsqueda de documentación sobre esto, encontré un commit a Git que indica que el formato se alimenta directamente strftime. Buscando strftime( aquí o aquí ) los marcadores de posición que encontré coinciden con los marcadores de posición enumerados.

Los marcadores de posición 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 A.M./P.M. 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
%%      Percent sign

En un comando completo sería algo así como

git config --global alias.lg "log --graph --decorate -30 --all --date-order --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(cyan)%h%Creset %C(black bold)%ad%Creset%C(auto)%d %s'" 
Ben Allred
fuente
44
@ Shiva: Recientemente me encontré con un caso en el que no funcionó y puede ser lo mismo con lo que te encuentras. Estaba usando una máquina de emparejamiento con una versión anterior de Git. Cuando actualicé Git, el formato de fecha personalizado comenzó a funcionar. Si echas un vistazo al commit vinculado anteriormente, creo que necesitarás al menos v2.6.0-rc0. El ejemplo dado es exactamente lo que uso. En un comando completo sería algo así comogit config --global alias.lg "log --graph --decorate -30 --all --date-order --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(cyan)%h%Creset %C(black bold)%ad%Creset%C(auto)%d %s'"
Ben Allred
1
Gracias ben! Pegué su comando tal como está y ejecuté el git lgy todavía recibo el siguiente error. fatal: unknown date format format:%Y-%m-%d %H:%M:%S. Estoy ejecutando git en windows. Aquí está mi versión git. git version 1.9.5.msysgit.1. Entonces, ¿tengo que actualizar a la versión más nueva?
Shiva
Hola Ben, estaba en la versión anterior. Actualicé a la última y esto funciona. ¡Así que edité tu respuesta para que sea más clara (moví tu comentario a la parte superior) y también te hice +1! ¡¡Gracias!!
Shiva
Esto funciona de maravilla! Utilizando un script bash simple para exportar un csv, ahora puedo tener columnas por año, mes, semana, etc. Me encanta.
Jamie Taylor
1
@EdRandall: Si te estás refiriendo a %X~~, acabo de probarlo en mi máquina y definitivamente obtengo horas en mi zona horaria. ~~ Hmm, ahora no estoy seguro. Cloné un repositorio de alguien que no estaba en mi zona horaria e intenté nuevamente. Creo que estoy formateando la hora usando la configuración regional actual pero con la zona horaria cortada.
Ben Allred
36

Después de mucho tiempo buscando una manera de obtener git logla fecha en el formato YYYY-MM-DDde una manera que funcionara less, se me ocurrió el siguiente formato:

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

junto con el interruptor --date=iso.

Esto imprimirá la fecha en formato ISO (uno largo) y luego imprimirá 14 veces el carácter de retroceso (0x08), que, en mi terminal, elimina efectivamente todo después de la parte AAAA-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 lcon algunos ajustes en el formato anterior. Muestra el gráfico de compromiso a la izquierda, luego el hash del compromiso, seguido de la fecha, los nombres cortos, los nombres de referencia y el asunto. El alias es el siguiente (en ~ / .gitconfig):

[alias]
        l = log --date-order --date=iso --graph --full-history --all --pretty=format:'%x08%x09%C(red)%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'
Bruno Reis
fuente
2
Este trabajo es muy bueno para mi. Usar 6 de% x08 elimina exactamente la zona horaria final para mí.
Penghe Geng
77
¿Qué pasa?--date=short shows only date but not time, in YYYY-MM-DD format.
Paaske
3
En zsh y bash, esto muestra la salida en la terminal, pero si la conecta a cualquier cosa, los datos "retrocedidos" todavía están allí. Esto significa que cosas como | sort | uniqno funcionan.
chmac
55
Esto es ridículo e impresionante al mismo tiempo. Estoy usando %C(bold cyan)%ai%x08%x08%x08%x08%x08%x08%x08%x08%x08%C(reset) %C(bold green)(%ar%x08%x08%x08%x08)%C(reset)para obtener el formato 2015-01-19 11:27 (11 days). +1
naught101
2
ahora esta respuesta stackoverflow.com/a/34778736/907576 es más adecuada (desde Git v2.6.0-rc0)
radistao
25

Puede usar la opción de truncamiento de campo para evitar tantos %x08caracteres. 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 a la vista.

Mejor aún, para este ejemplo en particular, el uso %cdrespetará el --date=<format>, por lo que si lo desea YYYY-MM-DD, puede hacer esto y evitar %<y por %x08completo:

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

Acabo de notar que esto era un poco circular con respecto a la publicación original, pero lo dejaré en caso de que otros lleguen aquí con los mismos parámetros de búsqueda que hice.

dvhart
fuente
23

Necesitaba lo mismo y encontré que lo siguiente funcionaba para mí:

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

El --date=formatformatea la salida fecha en que el --prettydice lo que desea imprimir.

lac_dev
fuente
2
Esto no funciona para mi. Obtengo "formato de fecha desconocido"
Ray
¿Qué versión de git tienes?
lac_dev
Actualizado usando medium.com/@katopz/how-to-upgrade-git-ff00ea12be18
barista aficionado
git log --pretty=format:"%h%x09%cd%x09%s" --date=format:'%Y-%m-%d %H:%M:%S %p'
barista aficionado
@amateurbarista que no muestra la última confirmación, lea la solicitud. ar3 está intentando mostrar la última confirmación, no las últimas confirmaciones.
lac_dev
16

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

bonita: proporcione un estricto formato de fecha ISO 8601

El formato de fecha "ISO" de Git realmente no se ajusta al estándar ISO 8601 debido a pequeñas diferencias, y no puede ser analizado por analizadores que solo sean ISO 8601, por ejemplo, los de las cadenas de herramientas XML.

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

  • un espacio en lugar del Tdelimitador de fecha / hora
  • un espacio entre el tiempo y la zona horaria
  • sin dos puntos entre las horas y minutos de la zona horaria

Agregue un estricto formato de fecha ISO 8601 para mostrar las fechas de confirmación y autor.
Utilice los especificadores de formato ' %aI' y ' %cI' y agregue nombres de formato de fecha ' --date=iso-strict' o ' --date=iso8601-strict'.

Ver este hilo para la discusión.

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

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

leopardo
fuente
Gracias. Lo modifiqué con% ct
cagney
5

Git 2.7 (Q4 2015) se presentará -localcomo 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 -localsufijo no se puede usar con rawo relative. Referencia .

Ahora puede solicitar cualquier formato de fecha utilizando la zona horaria local . Ver

Ver commit add00ba , commit 547ed71 (03 Sep 2015) por Jeff King ( peff) .
(Fusionada por Junio ​​C Hamano - gitster- en commit 7b09c45 , 05 oct 2015)

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

date: hacer " local" ortogonal a formato de fecha:

La mayoría de nuestros --datemodos " " se refieren al formato de la fecha: qué elementos mostramos y en qué orden.
Pero " --date=local" es un poco raro. Significa "mostrar la fecha en el formato normal, pero utilizando la zona horaria local".
La zona horaria que utilizamos es ortogonal al formato real, y no hay razón para que no podamos tener "iso8601 localizado", etc.

Este parche agrega un " local" campo booleano a " struct date_mode" y elimina el DATE_LOCALelemento de la date_mode_typeenumeración (ahora es DATE_NORMALmás local=1).
Los usuarios pueden acceder a la nueva función agregando " -local" a cualquier modo de fecha (por ejemplo, " iso-local"), y conservamos " local" como un alias para " default-local" para la compatibilidad con versiones anteriores.

VonC
fuente
2
Debo señalar que las format-localobras también! Por eso es muy perfecto que fusionen el poder entre el formato favorito y el local.
acgtyrant
5

La opción de formato %aiera lo que quería:

%ai: fecha de autor, formato similar a ISO 8601

--format="%ai"
ThorSummoner
fuente
5

Necesito la fecha en un formato especial.

Con Git 2.21 (Q1 2019), se ha introducido un nuevo formato de fecha " --date=human" que transforma su salida dependiendo de qué tan lejos esté la hora de la hora actual .

" --date=auto" se puede usar para usar este nuevo formato cuando la salida va al localizador o al terminal y, de lo contrario, al formato predeterminado.

Ver commit 110a6a1 , commit b841d4f (29 de enero de 2019) y commit 038a878 , commit 2fd7c22 (21 de enero de 2019) por Stephen P. Smith (``) .
Ver commit acdd377 (18 Jan 2019) por Linus Torvalds ( torvalds) .
(Fusionada por Junio ​​C Hamano - gitster- en commit ecbe1be , 07 feb 2019)

Agregar documentación de formato de fecha 'humana'

Muestre información de fecha y hora en un formato similar a cómo las personas escriben fechas en otros contextos.
Si no se especifica el año, el lector deduce que la fecha indicada es el año actual .

Al no mostrar la información redundante, el lector se concentra en la información que es diferente .
El parche informa las fechas relativas basadas en la información inferida de la fecha en la máquina que ejecuta el gitcomando en el momento en que se ejecuta el comando.

Si bien el formato es más útil para los humanos al descartar información inferida, no hay nada que lo haga realmente humano.
Si el ' relative' formato de fecha no estuviera implementado, usar ' relative' hubiera sido apropiado.

Agregar humanpruebas de formato de fecha.

Cuando se utilizan humanvarios campos, se suprimen dependiendo de la diferencia horaria entre la fecha de referencia y la fecha de la computadora local.

  • En los casos en que la diferencia es inferior a un año, el campo de año se suprime.
  • Si el tiempo es menos de un día; el mes y año se suprime.
check_date_format_human 18000       "5 hours ago"       #  5 hours ago
check_date_format_human 432000      "Tue Aug 25 19:20"  #  5 days ago
check_date_format_human 1728000     "Mon Aug 10 19:20"  #  3 weeks ago
check_date_format_human 13000000    "Thu Apr 2 08:13"   #  5 months ago
check_date_format_human 31449600    "Aug 31 2008"       # 12 months ago
check_date_format_human 37500000    "Jun 22 2008"       #  1 year, 2 months ago
check_date_format_human 55188000    "Dec 1 2007"        #  1 year, 9 months ago
check_date_format_human 630000000   "Sep 13 1989"       # 20 years ago

## Reemplace el ' auto' modo propuesto con ' auto:'

Además de agregar el humanformato ' ', el parche agregó la autopalabra clave que podría usarse en el archivo de configuración como una forma alternativa de especificar el formato humano. Al eliminar 'auto' se limpia la humaninterfaz de formato ' '.

Se agregó la capacidad de especificar el modo ' foo' si el localizador se está utilizando mediante la auto:foosintaxis.
Por lo tanto, el auto:humanmodo de fecha predeterminado es humansi estamos usando el localizador.
Entonces puedes hacer:

git config --add log.date auto:human

y sus " git log" comandos mostrarán el formato legible para humanos a menos que esté escribiendo secuencias de comandos.


Git 2.24 (Q4 2019) simplificó el código.

Ver commit 47b27c9 , commit 29f4332 (12 de septiembre de 2019) por Stephen P. Smith (``) .
(Fusionada por Junio ​​C Hamano - gitster- en commit 36d2fca , 07 oct 2019)

Deje de pasar 'ahora' al código de fecha

Commit b841d4f (Agregar humanformato a la herramienta de prueba, 2019-01-28, Git v2.21.0-rc0) agregó una get_time()función que permite $GIT_TEST_DATE_NOWen el entorno anular la hora actual.
Entonces ya no necesitamos interpretar esa variable cmd__date().

Por lo tanto, podemos dejar de pasar el nowparámetro " " a través de las funciones de fecha, ya que nadie las usa.
Tenga en cuenta que debemos asegurarnos de que todos los llamadores anteriores que tomaron un " now" parámetro están utilizando correctamente get_time().

VonC
fuente
2
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]"
webb
fuente
¿Cuidado para elaborar? Además, su respuesta ya tiene un campo de autor e historial. No es necesario firmarlo.
Kissaki
2

Use Bash y el comando de fecha para convertir de un formato similar a ISO al que desee. Quería un formato de fecha en modo org (y un elemento de lista), 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
Liam
fuente