Come modificare i formati della data del registro Git


150

Sto cercando di visualizzare l'ultimo commit in Git, ma ho bisogno della data in un formato speciale.

So che il formato piuttosto log %adrispetta il --dateformato, ma l'unico --dateformato che riesco a trovare è "breve". Voglio conoscere gli altri e se posso crearne uno personalizzato come:

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

1
Trovo sempre che la documentazione ufficiale di Linux Kernel Git sia una risorsa eccellente per questo tipo di domande.

2
Nota: ora (novembre 2014, Git 2.2) hai --date=iso-strict: vedi la mia risposta di seguito
VonC

4
Con git 2.7 (Q4 2015), puoi chiedere di usare il fuso orario locale per qualsiasi formato di data! Vedi la mia risposta qui sotto . Significa che, oltre a --date=(relative|local|default|iso|iso-strict|rfc|short|raw), avrai anche:--date=(relative-local|default-local|iso-local|iso-strict-local|rfc-local|short-local|raw-local)
VonC

Risposte:


167

Gli altri sono (da 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).

Non esiste un modo integrato che conosco per creare un formato personalizzato, ma puoi fare un po 'di magia conchiglia.

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

Il primo passo qui ti dà un millisecondo di data e ora. È possibile modificare la seconda riga per formattare il timestamp nel modo desiderato. Questo esempio ti dà qualcosa di simile a --date=local, con una giornata imbottita.


E se vuoi un effetto permanente senza digitare questo ogni volta, prova

git config log.date iso 

Oppure, per avere effetto su tutto il tuo utilizzo di git con questo account

git config --global log.date iso

15
E se vuoi un effetto permanente senza digitare questo ogni volta, prova qualcosa di simile git config log.date isoo, per avere effetto su tutto il tuo utilizzo di git con questo accountgit config --global log.date iso
Stéphane Gourichon,

12
Puoi usare i tuoi formati. vedi la risposta di Ben Allred . --format:<args>passerà <args>allo strftime.
Captain Man,

190

Inoltre --date=(relative|local|default|iso|iso-strict|rfc|short|raw), come altri hanno già detto, è anche possibile utilizzare un formato data registro personalizzato con

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

Questo produce qualcosa di simile 2016-01-13 11:32:13.

NOTA: se dai un'occhiata al commit collegato di seguito, credo che dovrai almeno Git v2.6.0-rc0farlo funzionare.

In un comando completo sarebbe qualcosa del tipo:

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'" 

Non sono stato in grado di trovarlo nella documentazione da nessuna parte (se qualcuno sa dove trovarlo, si prega di commentare), quindi inizialmente ho trovato i segnaposto per tentativi ed errori.

Nella mia ricerca di documentazione su questo ho trovato un commit a Git stesso che indica che il formato è alimentato direttamente strftime. Guardando strftime( qui o qui ) i segnaposto che ho trovato corrispondono ai segnaposto elencati.

I segnaposto includono:

%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

In un comando completo sarebbe qualcosa di simile

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'" 

4
@ Shiva: di recente mi sono imbattuto in un caso in cui non ha funzionato e potrebbe essere la stessa cosa in cui ti imbatti. Stavo usando un accoppiatore con una versione precedente di Git. Quando ho aggiornato Git, il formato della data personalizzato ha iniziato a funzionare. Se dai un'occhiata al commit collegato sopra, credo che avrai bisogno almeno della v2.6.0-rc0. L'esempio fornito è esattamente quello che uso. A pieno titolo sarebbe qualcosa del generegit 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 il

1
Grazie Ben! Ho incollato il tuo comando così com'è ed eseguito il git lge ancora ottengo il seguente errore. fatal: unknown date format format:%Y-%m-%d %H:%M:%S. Sto eseguendo git su Windows. Ecco la mia versione git. git version 1.9.5.msysgit.1. Quindi devo aggiornare alla versione più recente?
Shiva,

Ciao Ben, ero nella versione precedente. Ho eseguito l'aggiornamento alla versione più recente e questo funziona. Quindi ho modificato la tua risposta per renderlo più chiaro (ho spostato il tuo commento in alto) e ho anche fatto +1 su di te! Grazie!!
Shiva

Funziona a meraviglia! Usando un semplice script bash per esportare un csv, ora posso avere colonne per anno, mese, settimana ecc. Lo adoro.
Jamie Taylor,

1
@EdRandall: Se ti riferisci a %X, ~~ L'ho appena provato sulla mia macchina e sicuramente ho ottenuto orari nel mio fuso orario. ~~ Hmm, ora non sono sicuro. Ho clonato un repository da qualcuno che non era nel mio fuso orario e ho riprovato. Penso che sto solo ricevendo la formattazione dell'ora utilizzando le impostazioni locali correnti ma con il fuso orario disattivato.
Ben Allred,

36

Dopo molto tempo alla ricerca di un modo per ottenere l' git logoutput della data nel formato YYYY-MM-DDin un modo che funzionasse less, ho trovato il seguente formato:

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

insieme all'interruttore --date=iso.

Questo stamperà la data in formato ISO (una lunga), quindi stamperà 14 volte il carattere backspace (0x08), che, nel mio terminale, rimuove efficacemente tutto dopo la parte AAAA-MM-GG. Per esempio:

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

Questo dà qualcosa del tipo:

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

Quello che ho fatto è stato creare un alias chiamato lcon alcune modifiche sul formato sopra. Mostra il grafico di commit a sinistra, quindi l'hash del commit, seguito dalla data, dai nomi brevi, dai nomi di riferimento e dall'oggetto. L'alias è il seguente (in ~ / .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'

2
Questo funziona molto bene per me. L'uso del 6% di x08 rimuove esattamente il fuso orario finale per me.
Penghe Geng,

7
Che dire--date=short shows only date but not time, in YYYY-MM-DD format.
Paaske,

3
In zsh e bash questo mostra l'output sul terminale, ma se lo installi in qualcosa, i dati "backspaced" sono ancora lì. Questo significa che cose come | sort | uniqnon funzionano.
Chmac,

5
Questo è ridicolo e fantastico allo stesso tempo. Sto 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)per ottenere il formato 2015-01-19 11:27 (11 days). +1
nought101

2
ora questa risposta stackoverflow.com/a/34778736/907576 è più adatta (dal momento che Git v2.6.0-rc0)
radistao

25

È possibile utilizzare l'opzione di troncamento dei campi per evitare un numero così elevato di %x08caratteri. Per esempio:

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

è 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>'

E un po 'più facile per gli occhi.

Meglio ancora, per questo esempio particolare, usare %cdonorerà il --date=<format>, quindi se vuoi YYYY-MM-DD, puoi farlo ed evitare %<e del %x08tutto:

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

Ho appena notato che era un po 'circolare rispetto al post originale, ma lo lascio nel caso in cui altri siano arrivati ​​qui con gli stessi parametri di ricerca che ho fatto.


23

Avevo bisogno della stessa cosa e ho trovato il seguente lavoro per me:

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

Il --date=formatformatta l'output della data in cui la --prettyracconta cosa stampare.


2
Questo non funziona per me. Ottengo "formato data sconosciuto"
Ray

che versione di git hai?
lac_dev,


git log --pretty=format:"%h%x09%cd%x09%s" --date=format:'%Y-%m-%d %H:%M:%S %p'
barista dilettante,

@amateurbarista che non mostra l'ultimo commit, leggi la richiesta. ar3 sta provando a mostrare l'ultimo commit, non gli ultimi commit.
lac_dev,

16

Fai attenzione al date=isoformato " ": non è esattamente ISO 8601 .
Vedi commit " 466fb67 " di Beat Bolli ( bbolli) , per Git 2.2.0 (novembre 2014)

piuttosto: fornisce un formato data ISO 8601 rigoroso

Il formato della data "ISO" di Git non è realmente conforme allo standard ISO 8601 a causa di piccole differenze e non può essere analizzato dai parser solo ISO 8601, ad esempio quelli delle toolchain XML.

L'output di " --date=iso" si discosta dall'ISO 8601 in questi modi:

  • uno spazio anziché il Tdelimitatore di data / ora
  • uno spazio tra ora e fuso orario
  • nessun colon tra ore e minuti del fuso orario

Aggiungi un formato di data ISO 8601 rigoroso per la visualizzazione delle date del committer e dell'autore.
Utilizzare gli identificatori di formato ' %aI' e ' %cI' e aggiungere ' --date=iso-strict' o ' --date=iso8601-strict' nomi del formato della data.

Vedi questa discussione per la discussione.


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

Nota che questo si convertirà nel tuo fuso orario locale, nel caso sia importante per il tuo caso d'uso.


Grazie. L'ho modificato con% ct
cagney il

5

Git 2.7 (Q4 2015) verrà presentato -localcome un'istruzione.
Significa che, oltre a:

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

avrai anche:

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

Il -localsuffisso non può essere utilizzato con rawo relative. Riferimento .

Ora puoi richiedere qualsiasi formato di data utilizzando il fuso orario locale . Vedere

Vedi commit add00ba , commit 547ed71 (03 set 2015) di Jeff King ( peff) .
(Unita da Junio ​​C Hamano - gitster- in commit 7b09c45 , 05 ott 2015)

In particolare, l'ultimo dall'alto (commit add00ba) menziona:

date: crea " local" ortogonale al formato data:

La maggior parte delle nostre " --date" modalità riguardano il formato della data: quali elementi mostriamo e in quale ordine.
Ma " --date=local" è un po 'strano. Significa "mostra la data nel formato normale, ma utilizzando il fuso orario locale".
Il fuso orario che utilizziamo è ortogonale al formato effettivo e non vi è alcun motivo per cui non potremmo avere "iso8601 localizzato", ecc.

Questa patch aggiunge un " local" campo booleano a " struct date_mode" e rilascia l' DATE_LOCALelemento date_mode_typedall'enum (ora è solo DATE_NORMALpiù local=1).
La nuova funzione è accessibile agli utenti aggiungendo " -local" a qualsiasi modalità data (ad es. " iso-local") E conserviamo " local" come alias per " default-local" per compatibilità con le versioni precedenti.


2
Devo notare che format-localfunziona anche! Quindi è molto perfetto che unisca il potere tra il formato preferito e locale.
acgtyrant,

5

L'opzione di formato %aiera quello che volevo:

%ai: data dell'autore, formato simile a ISO 8601

--format="%ai"

5

Ho bisogno della data in un formato speciale.

Con Git 2.21 (Q1 2019), è stato introdotto un nuovo formato di data " --date=human" che trasforma il suo output a seconda di quanto tempo è trascorso dall'ora corrente .

"--date=auto " può essere usato per usare questo nuovo formato quando l'output sta andando al cercapersone o al terminale e altrimenti al formato predefinito.

Vedi commit 110a6a1 , commit b841d4f (29 gennaio 2019) e commit 038a878 , commit 2fd7c22 (21 gennaio 2019) di Stephen P. Smith (``) .
Vedi commit acdd377 (18 gennaio 2019) di Linus Torvalds ( torvalds) .
(Unito da Junio ​​C Hamano - gitster- in commit ecbe1be , 07 feb 2019)

Aggiungi la documentazione "umana" in formato data

Visualizza le informazioni su data e ora in un formato simile a come le persone scrivono le date in altri contesti.
Se l'anno non viene specificato, il lettore indica che la data indicata è nell'anno corrente .

Non visualizzando le informazioni ridondanti, il lettore si concentra sulle informazioni diverse .
La patch riporta le date relative in base alle informazioni dedotte dalla data sulla macchina che esegue il gitcomando al momento dell'esecuzione del comando.

Mentre il formato è più utile per gli umani rilasciando informazioni dedotte, non c'è nulla che lo renda effettivamente umano.
Se il ' relative' formato della data non fosse già implementato, allora usare ' relative' sarebbe stato appropriato.

Aggiungi humantest del formato della data.

Quando si utilizzano humandiversi campi vengono soppressi a seconda della differenza di orario tra la data di riferimento e la data del computer locale.

  • Nei casi in cui la differenza è inferiore a un anno, il campo dell'anno viene soppresso.
  • Se il tempo è inferiore a un giorno; il mese e l'anno sono soppressi.
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

## Sostituisci la ' auto' modalità proposta con ' auto:'

Oltre ad aggiungere il humanformato " ", la patch ha aggiunto la autoparola chiave che potrebbe essere utilizzata nel file di configurazione come modo alternativo per specificare il formato umano. La rimozione di "auto" pulisce l' humaninterfaccia del formato " ".

Aggiunta la possibilità di specificare la modalità ' foo' se il cercapersone viene utilizzato utilizzando la auto:foosintassi.
Pertanto, la auto:humanmodalità data predefinita è humanse stiamo usando il cercapersone.
Quindi puoi fare:

git config --add log.date auto:human

e i tuoi git logcomandi " " mostreranno il formato leggibile dall'uomo a meno che tu non stia scrivendo cose.


Git 2.24 (Q4 2019) ha semplificato il codice.

Vedi commit 47b27c9 , commit 29f4332 (12 set 2019) di Stephen P. Smith (``) .
(Unito da Junio ​​C Hamano - gitster- in commit 36d2fca , 07 ott 2019)

Terminare il passaggio 'ora' al codice data

Commit b841d4f (Aggiungi humanformato a test-tool, 28-01-2019, Git v2.21.0-rc0) ha aggiunto una get_time()funzione che consente $GIT_TEST_DATE_NOWall'ambiente di sovrascrivere l'ora corrente.
Quindi non abbiamo più bisogno di interpretare quella variabile incmd__date() .

Pertanto, possiamo interrompere il passaggio del nowparametro " " attraverso le funzioni di data, poiché nessuno le utilizza.
Si noti che è necessario assicurarsi che tutti i chiamanti precedenti che hanno utilizzato un nowparametro " " vengano utilizzati correttamente get_time().


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]"

Ti interessa elaborare? Inoltre, la tua risposta ha già un campo autore e una cronologia. non c'è bisogno di firmarlo.
Kissaki,

2

Usa Bash e il comando date per convertire da un formato simile a ISO a quello che desideri. Volevo un formato data in modalità org (ed elemento dell'elenco), quindi ho fatto questo:

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

E il risultato è ad esempio:

+ [2015-09-13 Sun 22:44] 2b0ad02e6cec Merge pull request #72 from 3b/bug-1474631
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.