Comment changer les formats de date du journal Git

150

J'essaye d'afficher le dernier commit dans Git, mais j'ai besoin de la date dans un format spécial.

Je sais que le joli format du journal %adrespecte le --dateformat, mais le seul --dateformat que je peux trouver est "court". Je veux connaître les autres et savoir si je peux en créer un personnalisé tel que:

git -n 1 --date=**YYMMDDHHmm** --pretty=format:"Last committed item in this release was by %%an, %%aD, message: %%s(%%h)[%%d]"
ar3
la source
1
Je trouve toujours que la documentation officielle du noyau Linux Git est une excellente ressource pour ce genre de questions.
2
Remarque: vous avez maintenant (novembre 2014, Git 2.2) --date=iso-strict: voir ma réponse ci
VonC
4
Avec git 2.7 (Q4 2015), vous pouvez demander à utiliser le fuseau horaire local pour n'importe quel format de date! Voir ma réponse ci-dessous . Cela signifie que, en plus de --date=(relative|local|default|iso|iso-strict|rfc|short|raw), vous aurez également:--date=(relative-local|default-local|iso-local|iso-strict-local|rfc-local|short-local|raw-local)
VonC

Réponses:

167

Les autres sont (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).

Il n'y a pas de moyen intégré que je connaisse pour créer un format personnalisé, mais vous pouvez faire de la magie du shell.

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

La première étape ici vous donne un horodatage en millisecondes. Vous pouvez modifier la deuxième ligne pour formater cet horodatage comme vous le souhaitez. Cet exemple vous donne quelque chose de similaire à --date=local, avec une journée rembourrée.


Et si vous voulez un effet permanent sans le taper à chaque fois, essayez

git config log.date iso 

Ou, pour avoir un effet sur toute votre utilisation git avec ce compte

git config --global log.date iso
dmedvinsky
la source
15
Et si vous voulez un effet permanent sans le taper à chaque fois, essayez quelque chose comme git config log.date isoou, pour un effet sur toute votre utilisation git avec ce comptegit config --global log.date iso
Stéphane Gourichon
12
Vous pouvez utiliser vos propres formats. voir la réponse de Ben Allred . --format:<args>passera <args>à strftime.
Captain Man
190

En plus --date=(relative|local|default|iso|iso-strict|rfc|short|raw), comme d'autres l'ont mentionné, vous pouvez également utiliser un format de date de journal personnalisé avec

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

Cela produit quelque chose comme 2016-01-13 11:32:13.

REMARQUE: Si vous regardez le commit lié ci-dessous, je pense que vous en aurez besoin au moins Git v2.6.0-rc0pour que cela fonctionne.

Dans une commande complète, ce serait quelque chose comme:

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

Je n'ai pu trouver cela dans la documentation nulle part (si quelqu'un sait où le trouver, veuillez commenter), donc j'ai initialement trouvé les espaces réservés par essais et erreurs.

Dans ma recherche de documentation à ce sujet, j'ai trouvé un commit sur Git lui - même qui indique que le format est alimenté directement strftime. En recherchant strftime( ici ou ici ) les espaces réservés que j'ai trouvés correspondent aux espaces réservés répertoriés.

Les espaces réservés incluent:

%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

Dans une commande complète, ce serait quelque chose comme

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
la source
4
@Shiva: J'ai récemment rencontré moi-même un cas où cela n'a pas fonctionné et c'est peut-être la même chose que vous rencontrez. J'utilisais une machine d'appairage avec une ancienne version de Git. Lorsque j'ai mis à jour Git, le format de date personnalisé a commencé à fonctionner. Si vous regardez le commit lié à ci-dessus, je crois que vous aurez besoin d'au moins v2.6.0-rc0. L'exemple donné est exactement ce que j'utilise. Dans une commande complète, ce serait quelque chose commegit 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
Merci Ben! J'ai collé votre commande telle quelle et exécuté le git lget j'obtiens toujours l'erreur suivante. fatal: unknown date format format:%Y-%m-%d %H:%M:%S. J'exécute git sur windows. Voici ma version git. git version 1.9.5.msysgit.1. Dois-je donc passer à la nouvelle version?
Shiva
Salut Ben, j'étais sur l'ancienne version. Je suis passé à la dernière version et cela fonctionne. J'ai donc édité votre réponse pour la rendre plus claire (déplacé votre commentaire vers le haut) et aussi + 1-ed vous! Merci!!
Shiva
Cela fonctionne un régal! En utilisant un simple script bash pour exporter un csv, je peux maintenant avoir des colonnes pour l'année, le mois, la semaine, etc. J'adore ça.
Jamie Taylor
1
@EdRandall: Si vous parlez de %X, ~~ Je viens de l'essayer sur ma machine et j'ai définitivement des heures dans mon fuseau horaire. ~~ Hmm, maintenant je ne suis pas sûr. J'ai cloné un repo d'une personne qui n'est pas dans mon fuseau horaire et j'ai réessayé. Je pense que je ne fais que mettre l'heure au format en utilisant les paramètres régionaux actuels, mais avec le fuseau horaire coupé.
Ben Allred
36

Après avoir longtemps cherché un moyen d'obtenir la git logsortie de la date au format YYYY-MM-DDd'une manière qui fonctionnerait less, j'ai proposé le format suivant:

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

avec l'interrupteur --date=iso.

Cela imprimera la date au format ISO (un long), puis imprimera 14 fois le caractère de retour arrière (0x08), ce qui, dans mon terminal, supprime efficacement tout après la partie AAAA-MM-JJ. Par exemple:

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

Cela donne quelque chose comme:

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

Ce que j'ai fait, c'est créer un alias nommé lavec quelques ajustements sur le format ci-dessus. Il montre le graphe de validation à gauche, puis le hachage du commit, suivi de la date, des noms courts, des refnames et du sujet. L'alias est le suivant (dans ~ / .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
la source
2
Cela fonctionne très bien pour moi. L'utilisation de 6 sur% x08 supprime exactement le fuseau horaire de fin pour moi.
Penghe Geng
7
Qu'en est-il--date=short shows only date but not time, in YYYY-MM-DD format.
Paaske
3
Dans zsh et bash, cela montre la sortie sur le terminal, mais si vous la dirigez vers quelque chose, les données "backspaced" sont toujours là. Cela signifie que des choses comme | sort | uniqne fonctionnent pas.
chmac
5
C'est ridicule et génial à la fois. J'utilise %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)pour obtenir le format 2015-01-19 11:27 (11 days). +1
rien101
2
maintenant cette réponse stackoverflow.com/a/34778736/907576 est plus appropriée (depuis Git v2.6.0-rc0)
radistao
25

Vous pouvez utiliser l'option de troncature de champ pour éviter autant de %x08caractères. Par exemple:

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

est équivalent à:

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

Et un peu plus facile pour les yeux.

Mieux encore, pour cet exemple particulier, l'utilisation %cdhonorera le --date=<format>, donc si vous le souhaitez YYYY-MM-DD, vous pouvez le faire et éviter %<et %x08entièrement:

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

Je viens de remarquer que c'était un peu circulaire par rapport au message d'origine, mais je le laisserai au cas où d'autres arriveraient ici avec les mêmes paramètres de recherche que moi.

dvhart
la source
23

J'avais besoin de la même chose et j'ai trouvé ce qui suit fonctionnant pour moi:

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

La --date=formatforme la sortie de la date où le --prettydit quoi imprimer.

lac_dev
la source
2
Cela ne fonctionne pas pour moi. J'obtiens un "format de date inconnu"
Ray
quelle version de git avez-vous?
lac_dev
Mis à jour à l'aide de 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'
barista amateur
@amateurbarista qui n'affiche pas le dernier commit, lisez la requête. ar3 essaie d'afficher le dernier commit, pas les derniers commits.
lac_dev
16

Attention au date=isoformat " ": ce n'est pas exactement ISO 8601 .
Voir commit " 466fb67 " de Beat Bolli ( bbolli) , pour Git 2.2.0 (novembre 2014)

pretty: fournir un format de date ISO 8601 strict

Le format de date "ISO" de Git n'est pas vraiment conforme à la norme ISO 8601 en raison de petites différences, et il ne peut pas être analysé par des analyseurs uniquement ISO 8601, par exemple ceux des chaînes d'outils XML.

La sortie de " --date=iso" s'écarte de la norme ISO 8601 de ces manières:

  • un espace au lieu du Tdélimiteur date / heure
  • un espace entre le temps et le fuseau horaire
  • pas de deux-points entre les heures et les minutes du fuseau horaire

Ajoutez un format de date ISO 8601 strict pour afficher les dates des auteurs et des auteurs.
Utilisez les spécificateurs de format « %aI» et « %cI» et ajoutez des noms de format de date « --date=iso-strict» ou « --date=iso8601-strict».

Consultez ce fil de discussion.

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

Notez que cela sera converti dans votre fuseau horaire local, au cas où cela importe pour votre cas d'utilisation.

guépard
la source
Merci. Je l'ai peaufiné avec% ct
cagney
5

Git 2.7 (Q4 2015) introduira -localcomme instruction.
Cela signifie qu'en plus de:

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

vous aurez également:

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

Le -localsuffixe ne peut pas être utilisé avec rawou relative. Référence .

Vous pouvez maintenant demander n'importe quel format de date en utilisant le fuseau horaire local . Voir

Voir commit add00ba , commit 547ed71 (03 septembre 2015) par Jeff King ( peff) .
(Fusionné par Junio ​​C Hamano - gitster- en commit 7b09c45 , 05 oct 2015)

En particulier, le dernier d'en haut (commit add00ba) mentionne:

date: faire "local " orthogonal au format de date:

La plupart de nos " --date" modes concernent le format de la date: quels éléments nous montrons et dans quel ordre.
Mais "--date=local " est un peu bizarre. Cela signifie "afficher la date au format normal, mais en utilisant le fuseau horaire local".
Le fuseau horaire que nous utilisons est orthogonal au format réel, et il n'y a aucune raison pour que nous ne puissions pas avoir "localisé iso8601", etc.

Ce patch ajoute un " local" champ booléen à " struct date_mode", et supprime l' DATE_LOCALélément de l' date_mode_typeénumération (c'est maintenant juste DATE_NORMALplus local=1).
La nouvelle fonctionnalité est accessible aux utilisateurs en ajoutant " -local" à n'importe quel mode de date (par exemple, " iso-local"), et nous conservons " local" comme alias pour " default-local" pour une compatibilité descendante.

VonC
la source
2
Je dois noter que les format-localtravaux aussi! C'est donc très parfait qui fusionne la puissance entre le format préféré et le local.
acgtyrant
5

L'option de format %aiétait ce que je voulais:

%ai: date de l'auteur, format de type ISO 8601

--format="%ai"
ThorSummoner
la source
5

J'ai besoin de la date dans un format spécial.

Avec Git 2.21 (Q1 2019), un nouveau format de date " --date=human" qui transforme sa sortie en fonction de la distance entre l'heure et l'heure actuelle a été introduit .

"--date=auto " peut être utilisé pour utiliser ce nouveau format lorsque la sortie est envoyée vers le téléavertisseur ou le terminal et sinon le format par défaut.

Voir commit 110a6a1 , commit b841d4f (29 janvier 2019) et commit 038a878 , commit 2fd7c22 (21 janvier 2019) par Stephen P. Smith (``) .
Voir commit acdd377 (18 janvier 2019) par Linus Torvalds ( torvalds) .
(Fusionné par Junio ​​C Hamano - gitster- in commit ecbe1be , 07 févr.2019 )

Ajouter une documentation sur le format de date `` humaine ''

Affichez les informations de date et d'heure dans un format similaire à la façon dont les gens écrivent des dates dans d'autres contextes.
Si l'année n'est pas spécifiée alors, le lecteur en déduit que la date est donnée dans l'année en cours .

En n'affichant pas les informations redondantes, le lecteur se concentre sur les informations différentes .
Le patch signale les dates relatives en fonction des informations déduites de la date sur la machine exécutant la gitcommande au moment où la commande est exécutée.

Bien que le format soit plus utile aux humains en supprimant les informations inférées, rien ne le rend réellement humain.
Si le relativeformat de date « » n’était pas déjà implémenté, utilisezrelative » aurait été approprié.

Ajouter human tests de format de date.

Lors de l'utilisation de humanplusieurs champs sont supprimés en fonction de la différence d'heure entre la date de référence et la date de l'ordinateur local.

  • Dans les cas où la différence est inférieure à un an, le champ année est supprimé.
  • Si le temps est inférieur à un jour; le mois et l'année sont supprimés.
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

## Remplacez le automode " " proposé par " auto:"

En plus d'ajouter le humanformat « », le correctif a ajouté le automot - clé qui pourrait être utilisé dans le fichier de configuration comme une autre façon de spécifier le format humain. La suppression de «auto» nettoie l' humaninterface de format « ».

Ajout de la possibilité de spécifier le mode « foo» si le pager est utilisé en utilisant la auto:foosyntaxe.
Par conséquent, le auto:humanmode de date est défini par défaut humansi nous utilisons le téléavertisseur.
Vous pouvez donc faire:

git config --add log.date auto:human

et vos git logcommandes " " afficheront le format lisible par l'homme, sauf si vous créez des scripts.


Git 2.24 (Q4 2019) a simplifié le code.

Voir commit 47b27c9 , commit 29f4332 (12 septembre 2019) par Stephen P. Smith (``) .
(Fusionné par Junio ​​C Hamano - gitster- dans commit 36d2fca , 07 octobre 2019)

Arrêtez de passer le code «maintenant» au date

Commit b841d4f (Ajouter un humanformat à test-tool, 2019-01-28, Git v2.21.0-rc0) a ajouté une get_time()fonction qui permet $GIT_TEST_DATE_NOWà l'environnement de remplacer l'heure actuelle.
Nous n'avons donc plus besoin d'interpréter cette variable dans cmd__date().

Par conséquent, nous pouvons arrêter de passer le nowparamètre " " dans les fonctions de date, car personne ne les utilise.
Notez que nous devons nous assurer que tous les appelants précédents qui ont pris un nowparamètre " " utilisent correctement get_time().

VonC
la source
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
la source
Voulez-vous élaborer? En outre, votre réponse a déjà un champ d'auteur et un historique. pas besoin de le signer.
Kissaki
2

Utilisez Bash et la commande de date pour convertir un format de type ISO à celui de votre choix. Je voulais un format de date en mode organisationnel (et un élément de liste), alors j'ai fait ceci:

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

Et le résultat est par exemple:

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