如何更改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 log
以YYYY-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:
- 一个空格而不是
T
date/时间分隔符- 时间和时区之间的空间
- 时区之间的小时和分钟之间没有冒号
添加严格的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
后缀不能用于raw
或relative
。 参考 。
您现在可以使用本地时区请求任何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_NORMAL
加local=1
)。
用户可以通过将“-local
”添加到任何date模式(例如“iso-local
”)来访问新function,并且为了向后兼容,我们保留“local
”作为“default-local
”的别名。