Cum să schimbați formatele de date ale jurnalului Git (Programare, Git, Linie De Comandă)

ar3 a intrebat.

Încerc să afișez ultima confirmare în Git, dar am nevoie de data într-un format special.

Știu că formatul de log destul de %ad respectă formatul --date dar singurul format --date format pe care îl pot găsi este „short”. Vreau să le știu pe celelalte și dacă pot crea unul personalizat, cum ar fi

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

Comentarii

  • Întotdeauna găsesc documentația oficială Git a nucleului Linux Kernel să fie o resursă excelentă pentru acest tip de întrebări. – utilizator456814
  • Notă: acum (nov. 2014, Git 2.2) aveți --date=iso-strict: a se vedea răspunsul meu de mai jos –  > Por VonC.
  • Cu git 2.7 (Q4 2015), puteți cere să utilizați fusul orar local pentru orice format de dată! Vedeți răspunsul meu de mai jos. Aceasta înseamnă că, în plus față de --date=(relative|local|default|iso|iso-strict|rfc|short|raw), , veți avea, de asemenea,: --date=(relative-local|default-local|iso-local|iso-strict-local|rfc-local|short-local|raw-local) –  > Por VonC.
  • Înrudite: Cum se poate schimba timestamp-ul unui commit vechi în Git? –  > Por kenorb.
12 răspunsuri
dmedvinsky

Celelalte sunt (din 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).

Nu există o modalitate încorporată pe care să o știu pentru a crea un format personalizat, dar puteți face ceva magie 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"

Primul pas aici vă obține un timestamp de milisecunde. Puteți schimba a doua linie pentru a formata acel timestamp cum doriți. Acest exemplu vă oferă ceva similar cu --date=local, cu o zi de completare.


Și dacă doriți un efect permanent fără a tasta acest lucru de fiecare dată, încercați

git config log.date iso 

Sau, pentru un efect asupra tuturor utilizărilor git cu acest cont

git config --global log.date iso

Comentarii

    16

  • Și dacă doriți un efect permanent fără a tasta asta de fiecare dată, încercați ceva de genul git config log.date iso sau, pentru a avea efect asupra tuturor utilizărilor git cu acest cont git config --global log.date iso –  > Por Stéphane Gourichon.
  • Puteți folosi propriile formate. consultați răspunsul lui Ben Allred. --format:<args> va trece <args> la strftime. –  > Por Captain Man.
Ben Allred

În plus față de --date=(relative|local|default|iso|iso-strict|rfc|short|raw), , așa cum au menționat și alții, puteți utiliza, de asemenea, un format de dată de jurnal personalizat cu

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

Acest lucru produce ceva de genul 2016-01-13 11:32:13.

NOTĂ: Dacă aruncați o privire la angajamentul legat de mai jos, cred că veți avea nevoie de cel puțin Git v2.6.0-rc0 pentru ca acest lucru să funcționeze.

Într-o comandă completă ar fi ceva de genul:

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

Nu am reușit să găsesc acest lucru în documentație nicăieri (dacă cineva știe unde să o găsească, vă rog să comentați), așa că am găsit inițial caracterele de poziție prin încercare și eroare.

În căutarea documentației în acest sens am găsit o trimitere la Git însuși care indică faptul că formatul este alimentat direct către strftime. Căutând strftime (aici sau aici), locurile pe care le-am găsit se potrivesc cu cele enumerate.

Printre acestea se numără:

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

Într-o comandă completă ar fi ceva de genul

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

Comentarii

  • @Shiva: Am întâlnit recent un caz în care nu a funcționat și s-ar putea să fie același lucru pe care îl întâlnești și tu. Foloseam o mașină de împerechere cu o versiune mai veche de Git. Când am actualizat Git, formatul de dată personalizat a început să funcționeze. Dacă aruncați o privire la commit-ul legat de mai sus, cred că veți avea nevoie de cel puțin v2.6.0-rc0. Exemplul dat este exact ceea ce folosesc eu. Într-o comandă completă ar fi ceva de genul 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'" –  > Por Ben Allred.
  • Mulțumesc, Ben! Am lipit comanda ta așa cum este și am rulat comanda git lg și tot primesc următoarea eroare. fatal: unknown date format format:%Y-%m-%d %H:%M:%S. Rulez git pe Windows. Aici este versiunea mea git. git version 1.9.5.msysgit.1. Deci, trebuie să fac upgrade la o versiune mai nouă? –  > Por Shiva.
  • Bună Ben, am fost pe versiunea mai veche. Am făcut upgrade la cea mai recentă și funcționează. Așa că ți-am editat răspunsul pentru a-l face mai clar (ți-am mutat comentariul în partea de sus) și, de asemenea, te-am +1! Mulțumesc!!! –  > Por Shiva.
  • @EdRandall: Dacă vă referiți la %X, , ~~ Tocmai am încercat-o pe mașina mea și cu siguranță primesc orele din fusul meu orar.~~ Hmm, acum nu mai sunt sigur. Am clonat un repo de la cineva care nu se află în fusul meu orar și am încercat din nou. Cred că primesc doar ora formatată folosind setările locale curente, dar fără fusul orar. –  > Por Ben Allred.
  • cum pot să pun --date=format:'%Y-%m-%d %H:%M:%S' în .gitconfig ? –  > Por Martin Vegter.
Bruno Reis

După o lungă perioadă de timp în care am căutat o modalitate de a obține git log a ieși data în format YYYY-MM-DD într-un mod care să funcționeze în less, , am ajuns la următorul format:

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

împreună cu comutatorul --date=iso.

Acest lucru va imprima data în format ISO (unul lung) și apoi va imprima de 14 ori caracterul backspace (0x08), care, în terminalul meu, elimină efectiv tot ce urmează după partea AAAA-MM-DD. De exemplu:

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

Acest lucru dă ceva de genul:

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

Ceea ce am făcut a fost să creez un alias numit l cu câteva modificări ale formatului de mai sus. Acesta arată graficul de confirmare în stânga, apoi hash-ul de confirmare, urmat de dată, nume scurte, nume de referință și subiect. Aliasul este următorul (în ~/.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'

Comentarii

  • Acest lucru funcționează foarte bine pentru mine. Utilizarea lui 6 din %x08 elimină exact fusul orar din urmă pentru mine. –  > Por Penghe Geng.
  • Ce se întâmplă cu --date=short shows only date but not time, in YYYY-MM-DD format. –  > Por Paaske.
  • În zsh și bash, acest lucru vă arată ieșirea pe terminal, dar dacă îl introduceți în ceva, datele „backspaced” sunt încă acolo. Acest lucru înseamnă că lucruri precum | sort | uniq nu funcționează. –  > Por chmac.
  • Acest lucru este ridicol și minunat în același timp. Eu folosesc %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) pentru a obține formatul 2015-01-19 11:27 (11 days). +1 –  > Por naught101.
  • acum acest răspuns stackoverflow.com/a/34778736/907576 este mai potrivit (de la Git v2.6.0-rc0) –  > Por radistao.
lac_dev

Am avut nevoie de același lucru și am găsit următoarele care funcționează pentru mine:

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

--date=format formatează data de ieșire în cazul în care --pretty spune ce să se tipărească.

Comentarii

  • Acest lucru nu funcționează pentru mine. Primesc „format de dată necunoscut” –  > Por Jim.
  • ce versiune de git aveți? –  > Por lac_dev.
  • Actualizat folosind medium.com/@katopz/how-to-upgrade-git-ff00ea12be18 –  > Por barista amator.
  • git log --pretty=format:"%h%x09%cd%x09%s" --date=format:'%Y-%m-%d %H:%M:%S %p' –  > Por barista amator.
  • @amateurbarista care nu arată ultima confirmare, citiți cererea. ar3 încearcă să arate ultima confirmare, nu ultimele câteva confirmări. –  > Por lac_dev.
dvhart

Puteți utiliza opțiunea de trunchiere a câmpurilor pentru a evita atât de multe %x08 caractere. De exemplu:

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

este echivalent cu:

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

Și destul de ușor pentru ochi.

Și mai bine, pentru acest exemplu particular, folosind %cd va respecta --date=<format>, , astfel încât dacă doriți YYYY-MM-DD, , puteți face acest lucru și să evitați %< și %x08 în întregime:

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

Tocmai am observat că acest lucru a fost un pic circular în ceea ce privește postul original, dar îl las în cazul în care alții au ajuns aici cu aceiași parametri de căutare ca și mine.

VonC

Fiți atenți la „date=iso„: nu este exact ISO 8601.
Consultați comiterea „466fb67” din Beat Bolli (bbolli), , pentru Git 2.2.0 (noiembrie 2014)

pretty: oferiți un format de dată strict ISO 8601

Formatul de dată „ISO” al lui Git nu este cu adevărat conform cu standardul ISO 8601 din cauza unor mici diferențe și nu poate fi analizat de analizoarele care utilizează doar ISO 8601, de exemplu cele ale lanțurilor de instrumente XML.

Ieșirea din „--date=iso” se abate de la ISO 8601 în aceste moduri:

  • un spațiu în loc de T delimitator de dată/ora
  • un spațiu între oră și fus orar
  • nu există două puncte între ore și minute din fusul orar

Adăugați un format de dată ISO 8601 strict pentru afișarea datelor de comitere și de autor.
Utilizați simbolul%aI‘ și ‘%cI‘ și adăugați--date=iso-strict‘ sau ‘--date=iso8601-strict‘ nume de formate de date.

A se vedea acest subiect pentru discuții.

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

Rețineți că acest lucru va converti în fusul orar local, în cazul în care acest lucru contează pentru cazul dvs. de utilizare.

Comentarii

  • Vă mulțumim. Am modificat-o cu %ct –  > Por cagney.
VonC

Git 2.7 (Q4 2015) va introduce -local ca instrucțiune.
Aceasta înseamnă că, în plus față de:

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

veți avea, de asemenea, și:

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

-local sufixul nu poate fi utilizat cu raw sau relative. Referință.

Acum puteți solicita orice format de dată utilizând fusul orar local.vezi

A se vedea commit add00ba, , commit 547ed71 (03 Sep 2015) de Jeff King (peff).
(Fuzionat de Junio C Hamano… gitster în trimite 7b09c45, , 05 Oct 2015)

În special, ultima de mai sus (commit add00ba) menționează:

date: make „local” să fie ortogonal cu formatul datei:

Cea mai mare parte a datelor noastre „--date” se referă la formatul datei: ce elemente arătăm și în ce ordine.
Dar „--date=local” este un pic ciudat. Acesta înseamnă „afișează data în formatul normal, dar folosind fusul orar local”.
Fusul orar pe care îl folosim este ortogonal cu formatul actual și nu există niciun motiv pentru care nu am putea avea „localizat iso8601” etc.

Acest patch adaugă o opțiune „local” la „struct date_mode„, și elimină câmpul DATE_LOCAL din elementul date_mode_type enum (acum este doar DATE_NORMAL plus local=1).
Noua caracteristică este accesibilă utilizatorilor prin adăugarea „-local” la orice mod de dată (de exemplu, „iso-local„), iar noi păstrăm „local” ca pseudonim pentru „default-local” pentru compatibilitate retroactivă.

Comentarii

  • Trebuie să remarc faptul că format-local funcționează și el! Deci, este foarte perfect că fuzionează puterea între formatul preferat și cel local. –  > Por acgtyrant.
VonC

Am nevoie de data într-un format special.

Odată cu Git 2.21 (Q1 2019), un nou format de dată „--date=human” care își transformă ieșirea în funcție de cât de departe este ora de ora curentă a fost introdus.

--date=auto” poate fi folosit pentru a utiliza acest nou format atunci când ieșirea se îndreaptă către pager sau către terminal, iar în caz contrar se folosește formatul implicit.

A se vedea Trimitere 110a6a1, , commit b841d4f (29 ian. 2019), și commit 038a878, , comit 2fd7c22 (21 ian 2019) de către Stephen P. Smith („).
A se vedea commit acdd377 (18 ian. 2019) de către Linus Torvalds (torvalds).
(Fuzionat de Junio C Hamano — gitster în trimite ecbe1be, , 07 feb 2019)

Adăugați documentația privind formatul de dată ‘uman’

Afișați informațiile despre dată și oră într-un format similar cu modul în care oamenii scriu datele în alte contexte.
Dacă anul nu este specificat atunci, cititorul deduce că data este dată este în anul curent.

Prin faptul că nu se afișează informațiile redundante, cititorul se concentrează asupra informațiilor care sunt diferite.
Patch-ul raportează datele relative pe baza informațiilor deduse din data de pe mașina pe care rulează aplicația git în momentul în care comanda este executată.

Deși formatul este mai util pentru oameni prin renunțarea la informațiile deduse, nu există nimic care să îl facă cu adevărat uman.
În cazul în care se utilizează opțiunea ‘relative‘ nu a fost deja implementat, atunci utilizarea formatului de dată ‘relative‘ ar fi fost adecvat.

Adăugați human testele pentru formatul datei.

Atunci când se utilizează human mai multe câmpuri sunt suprimate în funcție de diferența de timp dintre data de referință și data calculatorului local.

  • În cazul în care diferența este mai mică de un an, câmpul „an” este suprimat.
  • În cazul în care timpul este mai mic de o zi; se suprimă luna și anul.
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

## Înlocuiți textul propusauto‘ cuauto:

În plus față de adăugarea modului ‘human‘, patch-ul a adăugat și modul auto care poate fi utilizat în fișierul de configurare ca o modalitate alternativă de a specifica formatul uman. Îndepărtarea lui „auto” curăță formatulhuman‘ curăță interfața cu formatul ‘.

A fost adăugată posibilitatea de a specifica modul ‘foo‘ în cazul în care se utilizează pagerul, folosind auto:foo sintaxa.
Prin urmare, ‘auto:human‘ data mode este implicit la human dacă se utilizează pagerul.
Deci, puteți face:

git config --add log.date auto:human

și „git log” vor afișa formatul lizibil de către om, cu excepția cazului în care nu faceți un script.


Git 2.24 (Q4 2019) a simplificat codul.

Consultați commit 47b27c9, , commit 29f4332 (12 Sep 2019) de Stephen P. Smith („).
(Fuzionat de Junio C Hamano — gitster în trimite 36d2fca, , 07 Oct 2019)

Nu mai treceți ‘now’ în codul de dată

Trimiteți b841d4f (Adaugă human format to test-tool, 2019-01-28, 2019-01-28, Git v2.21.0-rc0) a adăugat un fișier get_time() funcție care permite $GIT_TEST_DATE_NOW în mediul de lucru să înlocuiască ora curentă.
Astfel, nu mai trebuie să interpretăm această variabilă în cmd__date().

Prin urmare, putem înceta să mai transmitem „now” prin intermediul funcțiilor date, deoarece nimeni nu le folosește.
Rețineți că trebuie să ne asigurăm că toți apelanții anteriori care au luat un parametru „now” folosesc corect parametrul get_time().

ThorSummoner

Opțiunea de format %ai a fost ceea ce am vrut:

%ai: data autorului, format de tip ISO 8601

--format="%ai"

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

Comentarii

  • Vreți să detaliați? De asemenea, răspunsul dvs. are deja un câmp autor și un istoric. nu este nevoie să îl semnați. –  > Por Kissaki.
Liam

Folosiți Bash și comanda date pentru a converti dintr-un format de tip ISO în cel dorit. Am vrut un org-mode format de dată (și element de listă), așa că am făcut asta:

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

Iar rezultatul este de exemplu:

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