So ändern Sie die Datumsformate des Git-Protokolls

150

Ich versuche, das letzte Commit in Git anzuzeigen, benötige aber das Datum in einem speziellen Format.

Ich weiß, dass das Protokoll-Format %addas Format respektiert --date, aber das einzige --dateFormat, das ich finden kann, ist "kurz". Ich möchte die anderen kennen und wissen, ob ich eine benutzerdefinierte erstellen kann, z.

git -n 1 --date=**YYMMDDHHmm** --pretty=format:"Last committed item in this release was by %%an, %%aD, message: %%s(%%h)[%%d]"
ar3
quelle
1
Ich finde die offizielle Linux Kernel Git-Dokumentation immer eine ausgezeichnete Quelle für diese Art von Fragen.
2
Hinweis: Sie haben jetzt (Nov. 2014, Git 2.2) --date=iso-strict: siehe meine Antwort unten
VonC
4
Mit git 2.7 (Q4 2015) können Sie die lokale Zeitzone für jedes Datumsformat verwenden! Siehe meine Antwort unten . Es bedeutet, dass Sie zusätzlich --date=(relative|local|default|iso|iso-strict|rfc|short|raw)auch haben:--date=(relative-local|default-local|iso-local|iso-strict-local|rfc-local|short-local|raw-local)
VonC

Antworten:

167

Die anderen sind (von 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).

Es gibt keine integrierte Methode, die ich kenne, um ein benutzerdefiniertes Format zu erstellen, aber Sie können etwas Shell-Magie ausführen.

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

Im ersten Schritt erhalten Sie einen Millisekunden-Zeitstempel. Sie können die zweite Zeile ändern, um den Zeitstempel nach Ihren Wünschen zu formatieren. Dieses Beispiel gibt Ihnen etwas Ähnliches --date=localmit einem gepolsterten Tag.


Und wenn Sie einen dauerhaften Effekt erzielen möchten, ohne dies jedes Mal einzugeben, versuchen Sie es

git config log.date iso 

Oder für die Auswirkung auf Ihre gesamte Git-Nutzung mit diesem Konto

git config --global log.date iso
dmedvinsky
quelle
15
Und wenn Sie einen dauerhaften Effekt wünschen, ohne dies jedes Mal git config log.date isogit config --global log.date iso
einzugeben
12
Sie können Ihre eigenen Formate verwenden. siehe Ben Allreds Antwort . --format:<args>wird <args>auf strftime übergehen.
Captain Man
190

Darüber hinaus können Sie --date=(relative|local|default|iso|iso-strict|rfc|short|raw), wie bereits erwähnt, auch ein benutzerdefiniertes Protokolldatum mit verwenden

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

Dies gibt so etwas wie aus 2016-01-13 11:32:13.

HINWEIS: Wenn Sie sich das unten verlinkte Commit ansehen, müssen Sie es zumindest benötigen, Git v2.6.0-rc0damit dies funktioniert.

In einem vollständigen Befehl wäre es so etwas wie:

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

Ich konnte dies nirgendwo in der Dokumentation finden (wenn jemand weiß, wo es zu finden ist, bitte kommentieren), also habe ich die Platzhalter ursprünglich durch Ausprobieren gefunden.

Bei meiner Suche nach Dokumentation dazu habe ich ein Commit für Git selbst gefunden , das angibt, dass das Format direkt eingespeist wird strftime. Wenn Sie strftime( hier oder hier ) nachsehen, stimmen die gefundenen Platzhalter mit den aufgeführten Platzhaltern überein.

Die Platzhalter umfassen:

%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 einem vollen Befehl wäre es so etwas wie

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
quelle
4
@Shiva: Ich bin kürzlich selbst auf einen Fall gestoßen, in dem es nicht funktioniert hat und es möglicherweise dasselbe ist, auf das Sie stoßen. Ich habe einen Pairing-Computer mit einer älteren Version von Git verwendet. Als ich Git aktualisiert habe, hat das benutzerdefinierte Datumsformat funktioniert. Wenn Sie sich das oben verlinkte Commit ansehen, benötigen Sie meiner Meinung nach mindestens v2.6.0-rc0. Das gegebene Beispiel ist genau das, was ich benutze. In einem vollen Befehl wäre es so etwas wiegit 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
Danke Ben! Ich habe Ihren Befehl so wie er ist eingefügt und ausgeführt git lgund erhalte immer noch den folgenden Fehler. fatal: unknown date format format:%Y-%m-%d %H:%M:%S. Ich laufe Git unter Windows. Hier ist meine Git-Version. git version 1.9.5.msysgit.1. Muss ich also auf die neuere Version aktualisieren?
Shiva
Hallo Ben, ich war auf der älteren Version. Ich habe auf das neueste aktualisiert und das funktioniert. Also habe ich deine Antwort bearbeitet, um sie klarer zu machen (habe deinen Kommentar nach oben verschoben) und dich auch mit + 1 bearbeitet! Vielen Dank!!
Shiva
Das ist ein Genuss! Mit einem einfachen Bash-Skript zum Exportieren einer CSV kann ich jetzt Spalten für Jahr, Monat, Woche usw. haben. Ich liebe es.
Jamie Taylor
1
@EdRandall: Wenn Sie sich darauf beziehen %X, ~~ Ich habe es gerade auf meinem Computer versucht und definitiv Zeiten in meiner Zeitzone erhalten. ~~ Hmm, jetzt bin ich mir nicht sicher. Ich habe ein Repo von jemandem geklont, der sich nicht in meiner Zeitzone befindet, und es erneut versucht. Ich glaube, ich bekomme nur die Zeit mit den aktuellen Gebietsschemaeinstellungen formatiert, aber die Zeitzone ist abgeschnitten.
Ben Allred
36

Nachdem ich lange nach einer Möglichkeit gesucht hatte, git logdas Datum im Format so auszugeben YYYY-MM-DD, dass es funktioniert less, fand ich das folgende Format:

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

zusammen mit dem Schalter --date=iso.

Dadurch wird das Datum im ISO-Format (ein langes) und anschließend das 14-fache der Rücktaste (0x08) gedruckt, wodurch in meinem Terminal effektiv alles nach dem JJJJ-MM-TT-Teil entfernt wird. Beispielsweise:

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

Dies gibt so etwas wie:

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

Ich habe einen Alias lmit einigen Änderungen am obigen Format erstellt. Es zeigt das Commit-Diagramm links, dann den Hash des Commits, gefolgt vom Datum, den Kurznamen, den Refnames und dem Betreff. Der Alias ​​lautet wie folgt (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'
Bruno Reis
quelle
2
Das funktioniert sehr gut für mich. Wenn Sie 6 von% x08 verwenden, wird für mich genau die nachfolgende Zeitzone entfernt.
Penghe Geng
7
Was ist mit--date=short shows only date but not time, in YYYY-MM-DD format.
Paaske
3
In zsh und bash zeigt dies, dass Sie auf dem Terminal ausgeben, aber wenn Sie es in irgendetwas weiterleiten, sind die "Backspaced" -Daten immer noch da. Dies bedeutet, dass Dinge wie | sort | uniqnicht funktionieren.
Chmac
5
Das ist lächerlich und großartig zugleich. Ich benutze %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), um das Format zu bekommen 2015-01-19 11:27 (11 days). +1
naught101
2
jetzt ist diese Antwort stackoverflow.com/a/34778736/907576 besser geeignet (seit Git v2.6.0-rc0)
radistao
25

Sie können die Option zum Abschneiden von Feldern verwenden, um so viele %x08Zeichen zu vermeiden . Beispielsweise:

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

ist äquivalent zu:

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

Und ein bisschen augenschonender.

Besser noch, für dieses spezielle Beispiel wird die Verwendung %cddie ehren. --date=<format>Wenn Sie möchten YYYY-MM-DD, können Sie dies tun und vermeiden %<und %x08ganz:

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

Ich habe gerade bemerkt, dass dies in Bezug auf den ursprünglichen Beitrag etwas kreisförmig war, aber ich werde es verlassen, falls andere mit den gleichen Suchparametern wie ich hier ankamen.

dvhart
quelle
23

Ich brauchte das Gleiche und fand Folgendes für mich:

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

Das --date=formatformatiert die Datumsausgabe, in der angegeben --prettywird, was gedruckt werden soll.

lac_dev
quelle
2
Das funktioniert bei mir nicht. Ich bekomme "unbekanntes Datumsformat"
Ray
Welche Version von Git hast du?
lac_dev
Aktualisiert mit medium.com/@katopz/how-to-upgrade-git-ff00ea12be18
Amateur Barista
git log --pretty=format:"%h%x09%cd%x09%s" --date=format:'%Y-%m-%d %H:%M:%S %p'
Amateur Barista
@amateurbarista, der nicht das letzte Commit anzeigt, lesen Sie die Anfrage. ar3 versucht, das letzte Commit anzuzeigen, nicht die letzten Commits.
lac_dev
16

Beachten Sie das date=isoFormat " ": Es ist nicht genau ISO 8601 .
Siehe Commit " 466fb67 " von Beat Bolli ( bbolli) für Git 2.2.0 (November 2014)

hübsch: Geben Sie ein striktes ISO 8601-Datumsformat an

Das "ISO" -Datumsformat von Git entspricht aufgrund kleiner Unterschiede nicht wirklich dem ISO 8601-Standard und kann nicht nur von ISO 8601-Parsern analysiert werden, z. B. von XML-Toolchains.

Die Ausgabe von " --date=iso" weicht auf folgende Weise von ISO 8601 ab:

  • ein Leerzeichen anstelle des TDatums- / Zeitbegrenzers
  • ein Raum zwischen Zeit und Zeitzone
  • Kein Doppelpunkt zwischen Stunden und Minuten der Zeitzone

Fügen Sie ein striktes ISO 8601-Datumsformat für die Anzeige von Committer- und Autorendaten hinzu.
Verwenden Sie die Formatbezeichner ' %aI' und ' %cI' und fügen Sie Datumsformatnamen ' --date=iso-strict' oder ' --date=iso8601-strict' hinzu.

Siehe diesen Thread zur Diskussion.

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

Beachten Sie, dass dies in Ihre lokale Zeitzone konvertiert wird, falls dies für Ihren Anwendungsfall von Bedeutung ist.

Gepard
quelle
Vielen Dank. Ich habe es mit% ct
cagney
5

Git 2.7 (Q4 2015) wird -localals Anleitung vorgestellt.
Es bedeutet, dass zusätzlich zu:

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

Sie werden auch haben:

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

Das -localSuffix kann nicht mit rawoder verwendet werden relative. Referenz .

Sie können jetzt mithilfe der lokalen Zeitzone nach einem beliebigen Datumsformat fragen . Sehen

Siehe commit add00ba , commit 547ed71 ( 03.09.2015 ) von Jeff King ( peff) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 7b09c45 , 05. Oktober 2015)

Insbesondere erwähnt der letzte von oben (Commit Add00ba):

date: " local" orthogonal zum Datumsformat machen:

Bei den meisten unserer " --date" -Modi geht es um das Format des Datums: Welche Elemente werden in welcher Reihenfolge angezeigt?
Aber " --date=local" ist ein bisschen seltsam. Es bedeutet "Zeigen Sie das Datum im normalen Format, aber unter Verwendung der lokalen Zeitzone".
Die von uns verwendete Zeitzone ist orthogonal zum tatsächlichen Format, und es gibt keinen Grund, warum wir keine "lokalisierte ISO8601" usw. haben könnten.

Dieser Patch fügt ein " local" boolesches Feld zu " struct date_mode" hinzu und löscht das DATE_LOCALElement aus der date_mode_typeAufzählung (es ist jetzt nur noch DATE_NORMALPlus local=1).
Auf die neue Funktion können Benutzer zugreifen, indem sie " -local" zu einem beliebigen Datumsmodus hinzufügen (z. B. " iso-local"). Aus Gründen der Abwärtskompatibilität behalten wir " local" als Alias ​​für " default-local" bei.

VonC
quelle
2
Ich muss beachten, dass das auch format-localfunktioniert! Es ist also sehr perfekt, die Kraft zwischen dem Lieblingsformat und dem lokalen Format zusammenzuführen.
Acgtyrant
5

Die Formatoption %aiwar das, was ich wollte:

%ai: Autorendatum, ISO 8601-ähnliches Format

--format="%ai"
ThorSummoner
quelle
5

Ich brauche das Datum in einem speziellen Format.

Mit Git 2.21 (Q1 2019) wurde ein neues Datumsformat " --date=human" eingeführt, das seine Ausgabe abhängig davon ändert, wie weit die Zeit von der aktuellen Zeit entfernt ist .

" --date=auto" kann verwendet werden, um dieses neue Format zu verwenden, wenn die Ausgabe an den Pager oder an das Terminal geht, andernfalls das Standardformat.

Siehe Commit 110a6a1 , Commit b841d4f (29. Januar 2019) und Commit 038a878 , Commit 2fd7c22 (21. Januar 2019) von Stephen P. Smith (``) .
Siehe Commit acdd377 (18. Januar 2019) von Linus Torvalds ( torvalds) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in commit ecbe1be , 07. Februar 2019)

Fügen Sie eine Dokumentation zum Datumsformat "Mensch" hinzu

Zeigen Sie Datums- und Uhrzeitinformationen in einem Format an, das dem Schreiben von Datumsangaben in anderen Kontexten ähnelt.
Wenn das Jahr nicht angegeben ist, schließt der Leser, dass das angegebene Datum im aktuellen Jahr liegt .

Indem die redundanten Informationen nicht angezeigt werden, konzentriert sich der Leser auf die Informationen, die unterschiedlich sind .
Der Patch meldet relative Daten basierend auf Informationen, die aus dem Datum auf dem Computer abgeleitet wurden, auf dem der gitBefehl zum Zeitpunkt der Befehlsausführung ausgeführt wird.

Während das Format für Menschen nützlicher ist, indem abgeleitete Informationen gelöscht werden, gibt es nichts, was es tatsächlich menschlich macht.
Wenn das relativeDatumsformat nicht bereits implementiert relativewäre, wäre die Verwendung von ' ' angemessen gewesen.

Hinzufügen von humanDatumsformat-Tests.

Bei Verwendung werden humanmehrere Felder abhängig von der Zeitdifferenz zwischen dem Referenzdatum und dem lokalen Computerdatum unterdrückt.

  • In Fällen, in denen die Differenz weniger als ein Jahr beträgt, wird das Jahresfeld unterdrückt.
  • Wenn die Zeit weniger als einen Tag beträgt; Der Monat und das Jahr werden unterdrückt.
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

## Ersetzen Sie den vorgeschlagenen ' auto' Modus durch ' auto:'

Zusätzlich zum Hinzufügen des ' human' - Formats fügte der Patch das autoSchlüsselwort hinzu , das in der Konfigurationsdatei als alternative Möglichkeit zur Angabe des menschlichen Formats verwendet werden kann. Durch Entfernen von 'auto' wird die Formatschnittstelle '' bereinigt human.

Es wurde die Möglichkeit hinzugefügt, den Modus ' foo' anzugeben , wenn der Pager mithilfe der auto:fooSyntax verwendet wird.
Daher ist der auto:humanDatumsmodus standardmäßig auf ' ' eingestellt, humanwenn wir den Pager verwenden.
So können Sie tun:

git config --add log.date auto:human

und Ihre " git log" Befehle geben das für Menschen lesbare Format an, es sei denn, Sie schreiben Skripte.


Git 2.24 (Q4 2019) hat den Code vereinfacht.

Siehe Commit 47b27c9 , Commit 29f4332 (12. September 2019) von Stephen P. Smith (``) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 36d2fca , 07. Oktober 2019)

Beenden Sie die Übergabe von "Jetzt" an den Datumscode

Commit b841d4f ( humanFormat zum Test-Tool hinzufügen, 2019-01-28, Git v2.21.0-rc0) hat eine get_time()Funktion hinzugefügt , mit der $GIT_TEST_DATE_NOWin der Umgebung die aktuelle Zeit überschrieben werden kann.
Wir müssen diese Variable also nicht mehr in interpretieren cmd__date().

Daher können wir aufhören, den nowParameter " " über die Datumsfunktionen weiterzugeben, da sie von niemandem verwendet werden.
Beachten Sie, dass wir sicherstellen müssen, dass alle vorherigen Aufrufer, die einen " now" -Parameter verwendet haben, korrekt verwendet werden get_time().

VonC
quelle
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
quelle
Möchtest du das näher erläutern? Außerdem enthält Ihre Antwort bereits ein Autorenfeld und einen Verlauf. keine Notwendigkeit, es zu unterschreiben.
Kissaki
2

Verwenden Sie Bash und den Befehl date, um von einem ISO-ähnlichen Format in das gewünschte zu konvertieren. Ich wollte ein org-Modus Datumsformat (und Listenposition), so dass ich dies tat:

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

Und das Ergebnis ist zum Beispiel:

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