web-dev-qa-db-fra.com

Comment changer les formats de date du journal Git

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

Je sais que le journal au format joli %ad respecte le --date format, mais le seul --date Le format 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]"
126
ar3

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).

À ma connaissance, il n’existe pas de méthode intégrée pour créer un format personnalisé, mais vous pouvez utiliser la 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"

La première étape ici vous donne un timestamp milliseconde. 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 matelassée.


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

git config log.date iso 

Ou, pour affecter toute votre utilisation de git avec ce compte

git config --global log.date iso
151
dmedvinsky

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

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

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

NOTE: Si vous jetez un coup d'œil au commit indiqué dans le lien ci-dessous, je pense que vous aurez besoin d'au moins Git v2.6.0-rc0 pour 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 pas pu trouver cela dans la documentation, où que ce soit (si quelqu'un sait où le trouver, merci de le commenter), j'ai donc initialement trouvé les espaces réservés par essais et erreurs.

Dans ma recherche de documentation sur ce sujet, j'ai trouvé n commit sur Git lui-même qui indique que le format est directement transmis à 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 comprennent:

%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'" 
148
Ben Allred

Après avoir longtemps cherché un moyen d’obtenir git log affiche la date au format YYYY-MM-DD d'une manière qui fonctionnerait dans less, je suis arrivé au 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 14 fois le caractère de retour arrière (0x08), ce qui, dans mon terminal, supprime effectivement tout ce qui suit 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 était de créer un alias nommé l avec quelques modifications sur le format ci-dessus. Il affiche le graphique de commit à gauche, suivi du hachage de commit, suivi de la date, des noms abrégés, des noms de référence et du sujet. Le pseudonyme 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'
36
Bruno Reis

Vous pouvez utiliser l'option de troncature de champ pour éviter autant de %x08 personnages. 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, en utilisant %cd honorera le --date=<format>, donc si vous voulez YYYY-MM-DD, vous pouvez le faire et éviter %< et %x08 entiè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 original, mais je le laisse au cas où d'autres personnes seraient arrivées ici avec les mêmes paramètres de recherche que moi.

24
dvhart

J'avais besoin de la même chose et j'ai trouvé le travail suivant pour moi:

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

Le --date=format formate la sortie de la date où le --pretty indique ce qu'il faut imprimer.

19
lac_dev

Soyez conscient de la "date=iso "format: ce n'est pas exactement ISO 8601 .
Voir commit " 466fb67 " de Beat Bolli (bbolli) , pour Git 2.2.0 (novembre 2014)

joli: 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 légères différences, et il ne peut pas être analysé par des analyseurs tels que ISO 8601, par exemple. ceux des chaînes d'outils XML.

La sortie de "--date=iso "s'écarte de l'ISO 8601 de la manière suivante:

  • un espace au lieu du délimiteur de date/heure T
  • un espace entre l'heure et le fuseau horaire
  • pas de colon entre les heures et les minutes du fuseau horaire

Ajoutez un format de date ISO 8601 strict pour afficher les dates de l'auteur et de l'auteur.
Utilisez le '%aI' et '%cI 'spécificateurs de format et ajouter' --date=iso-strict' ou '--date=iso8601-strict 'noms de format de date.

Voir ce fil pour discussion.

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

Notez que cela convertira votre fuseau horaire local, au cas où cela serait important pour votre cas d'utilisation.

11
Cheetah

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

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

--format="%ai"
5
ThorSummoner

Git 2.7 (T4 2015) introduira -local En tant qu'instruction.
Cela signifie qu’en plus de:

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

vous aurez aussi:

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

Le suffixe -local Ne peut pas être utilisé avec raw ou 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 sept. 2015) par Jeff King (peff) .
(Fusion par Junio ​​C Hamano - gitster - dans commit 7b09c45 , 5 octobre 2015)

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

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

La plupart de nos modes "--date" Concernent le format de la date: quels éléments nous affichons et dans quel ordre.
Mais "--date=local" Est un peu étrange. 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 actuel et il n’existe aucune raison pour laquelle nous ne pourrions pas avoir "iso8601 localisée", etc.

Ce patch ajoute un champ booléen "local" à "struct date_mode" Et supprime l'élément DATE_LOCAL De l'énumération date_mode_type (Il s'agit maintenant de DATE_NORMAL Plus 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 compatibilité avec les versions antérieures.

4
VonC
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]"
3
webb

Utilisez les commandes Bash et Date pour convertir un format de type ISO en celui de votre choix. Je voulais un org-mode format de date (et é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
2
Liam

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

Avec Git 2.21 (T1 2019), un nouveau format de date "--date=human _ "qui modifie sa sortie en fonction de la distance entre l'heure actuelle et l'heure actuelle .

"--date=auto "peut être utilisé pour utiliser ce nouveau format lorsque la sortie est dirigée vers le pageur ou le terminal, 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 - dans commit ecbe1be , 07 février 2019)

Ajouter une documentation 'humaine' au format de date

Affichez les informations de date et d'heure dans un format similaire à celui utilisé pour écrire les dates dans d'autres contextes.
Si l'année n'est pas spécifiée, le lecteur déduira que la date indiquée est celle de l'année en cours .

En n'affichant pas les informations redondantes, le lecteur se concentre sur les informations différentes .
Le correctif rapporte les dates relatives en fonction des informations déduites de la date sur la machine exécutant la commande git au moment de son exécution.

Bien que le format soit plus utile aux humains en supprimant des informations inférées, rien ne les rend réellement humaines.
Si le format de date 'relative' n'était pas déjà implémenté, utiliser 'relative' aurait été approprié.

Ajoutez human tests de format de date.

Lorsque vous utilisez human, plusieurs champs sont supprimés en fonction de la différence de temps 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

## Remplace le mode 'auto' proposé par 'auto: '

En plus d'ajouter le format 'human', le correctif a ajouté le mot clé auto qui pourrait être utilisé dans le fichier de configuration comme autre moyen de spécifier le format humain. Supprimer "auto" nettoie l'interface de formatage "human".

Ajout de la possibilité de spécifier le mode 'foo' si le pager est utilisé à l'aide de auto:foo syntaxe.
Par conséquent, 'auto:human _ le mode date par défaut est human si nous utilisons le pager.
Vous pouvez donc faire:

git config --add log.date auto:human

et ton "git log "les commandes montreront le format lisible par l’homme sauf si vous écrivez des scripts.

2
VonC