如何更改git日志的date格式

我正在尝试显示git中的最后一个提交,但我需要特殊格式的date。

我知道,日志漂亮格式%ad尊重 – --date格式,但我可以find唯一的--date格式是“短”。 我想知道其他人,是否可以创build一个自定义的,如:

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

其他人(从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, eg "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). 

我没有build立自定义格式的内置方式,但是你可以做一些魔法。

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

这里的第一步是给你一个毫秒的时间戳。 您可以更改第二行,以便根据需要格式化该时间戳。 这个例子给你类似于--date=local东西,填充一天。


如果你想永久性的效果,而不是每次input这个,试试

 git config log.date iso 

或者,通过这个账号来影响你所有的git使用

 git config --global log.date iso 

除了--date=(relative|local|default|iso|iso-strict|rfc|short|raw) ,还可以使用自定义日志date格式

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

这输出像2016-01-13 11:32:13

注意:如果你看看下面提到的提交,我相信你至less需要Git v2.6.0-rc0才能工作。

我无法在任何地方的文档中find这个(如果有人知道在哪里可以find它,请评论),所以我最初通过反复试验find了占位符。

在我对这个文档的search中,我发现了一个提交Git本身 ,表明格式直接送到strftime 。 查找strftime ( 这里或这里 )我发现的占位符匹配列出的占位符。 占位符包括

 %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 AM/PM 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; no characters if time zone is unknown %% Percent sign 

经过很长一段时间寻找一种方式来获得git logYYYY-MM-DD格式输出date的方式,将工作在less ,我想出了以下格式:

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

以及开关--date=iso

这将以ISO格式(长格式)打印date,然后打印14次退格字符(0x08),在我的terminal中,它将有效地移除YYYY-MM-DD部分之后的所有内容。 例如:

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

这给了像这样的东西:

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

我所做的就是创build一个名为l的别名,并对上面的格式进行一些调整。 它显示了左侧的提交图,然后是提交的哈希,后面是date,短名称,refnames和主题。 别名如下(在〜/ .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' 

您可以使用字段截断选项来避免相当多的%x08字符。 例如:

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

相当于:

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

在眼睛上更容易一些。

更好的是,对于这个特殊的例子,使用%cd会遵守--date=<format> ,所以如果你想要YYYY-MM-DD ,你可以这样做,并完全避免%<%x08

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

我只是注意到,这是关于原来的post有点循环,但我会离开它,以防其他人到达这里与我所做的相同的search参数。

请注意“ date=iso ”格式:它不完全是 ISO 8601 。
参见Beat Bolli( bbolli )的提交“ 466fb67 ”,Git 2.2.0(2014年11月)

漂亮:提供严格的ISO 8601date格式

Git的“ISO”date格式由于差别很小而不符合ISO 8601标准,并且不能通过仅用于ISO 8601的parsing器(例如XML工具链)进行parsing。

--date=iso ”的输出在这些方面偏离了ISO 8601:

  • 一个空格而不是Tdate/时间分隔符
  • 时间和时区之间的空间
  • 时区之间的小时和分钟之间没有冒号

添加严格的ISO 8601date格式以显示提交者和作者date。
使用' %aI '和' %cI '格式说明符并添加' --date=iso-strict '或' --date=iso8601-strict 'date格式名称。

看到这个线程的讨论。

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

请注意,这将转换为您当地的时区,以防万一您的用例。

格式选项%ai是我想要的。

%ai :作者date,ISO 8601-like格式

 --format="%ai" 

我需要做同样的事情,发现以下工作对我来说:

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

–date =格式格式化date输出,其中--pretty要打印的内容。

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

使用bash和date命令从类ISO格式转换为你想要的格式。 我想要一个组织模式的date格式(和列表项),所以我做到了

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

结果是例如

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

Git 2.7(2015年第四季度)将引入-local作为一个指令。
这意味着,除了:

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

你也将有:

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

-local后缀不能用于rawrelative 参考 。

您现在可以使用本地时区请求任何date格式。 看到

  • 提交99264e9 ,
  • 提交db7bae2 ,
  • 提交dc6d782 ,
  • 提交f3c1ba5 ,
  • 提交f95cecf ,
  • 提交4b1c5e1 ,
  • 提交8f50d26 ,
  • 提交78a8441 ,
  • 提交2df4e29 (2015年9月3日)作者: John Keeping( johnkeeping ) 。

请参阅Jeff King( peff )的 commit add00ba , commit 547ed71 (2015年9月3日) 。
(由Junio C gitster合并- gitster -在承诺7b09c45 ,2015年10月5日)

特别是从上面的最后(提交add00ba)提到:

date :使“ local ”与date格式正交:

我们的大多数“ – --date ”模式是关于date的格式:我们显示哪些项目以及以什么顺序。
但是“ --date=local ”有点古怪。 这意味着“以正常格式显示date,但使用本地时区”。
我们使用的时区与实际的格式是正交的,没有理由我们不能有“本地化的iso8601”等。

此修补程序将“ local ”布尔字段添加到“ struct date_mode ”,并从date_mode_type枚举中删除DATE_LOCAL元素(现在只是DATE_NORMALlocal=1 )。
用户可以通过将“ -local ”添加到任何date模式(例如“ iso-local ”)来访问新function,并且为了向后兼容,我们保留“ local ”作为“ default-local ”的别名。