如何更改Git日志日期格式


150

我正在尝试显示Git中的最后一次提交,但是我需要特殊格式的日期。

我知道日志漂亮格式%ad尊重--date格式,但是--date我能找到的唯一格式是“短格式”。我想了解其他人,以及是否可以创建自定义的人,例如:

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

1
我总是发现Linux Kernel Git官方文档是解决此类问题的绝佳资源。

2
注意:您现在(2014年11月,Git 2.2)具有--date=iso-strict:请参阅下面的答案
VonC

4
在git 2.7(Q4 2015)中,您可以要求将本地时区用于任何日期格式!请参阅下面的答案。这意味着,除了--date=(relative|local|default|iso|iso-strict|rfc|short|raw),您还将拥有:--date=(relative-local|default-local|iso-local|iso-strict-local|rfc-local|short-local|raw-local)
VonC 2015年

Answers:


167

其他是(来自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).

我不知道创建自定义格式的内置方法,但是您可以做一些外壳魔术。

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,但有填充日期。


如果您希望永久效果而不必每次都键入此命令,请尝试

git config log.date iso 

或者,为了影响您使用此帐户的所有git使用量

git config --global log.date iso

15
如果你想没有这个每次键入永久的影响,尝试像git config log.date iso与这个帐户所有的Git的使用,或者对于效果git config --global log.date iso
斯特凡纳·古里科

12
您可以使用自己的格式。参见Ben Allred的答案--format:<args>将传递<args>给strftime。
曼队长

190

除了--date=(relative|local|default|iso|iso-strict|rfc|short|raw),正如其他人提到的那样,您还可以将自定义日志日期格式与

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

这输出类似 2016-01-13 11:32:13

注意:如果您查看下面链接的提交,我相信您至少需要Git v2.6.0-rc0需要它才能起作用。

在完整的命令中,它将类似于:

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

我在任何地方的文档中都找不到(如果有人知道在哪里找到它,请发表评论),所以我最初是通过反复试验找到占位符的。

在搜索有关此文档的文档时,我发现对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 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

在完整的命令中,它将类似于

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

4
@Shiva:我最近遇到了一个案例,该案例不起作用,可能与您遇到的情况相同。我使用的是旧版Git的配对机器。当我更新Git时,自定义日期格式开始起作用。如果您看一下上面链接的提交,我相信您至少需要v2.6.0-rc0。给出的示例正是我所使用的。在完整的命令中,它将类似于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

1
谢谢本!我按原样粘贴了您的命令并运行git lg,但仍然收到以下错误。fatal: unknown date format format:%Y-%m-%d %H:%M:%S。我在Windows上运行git。这是我的git版本。git version 1.9.5.msysgit.1。那我必须升级到较新的版本吗?
湿婆

嗨,本,我使用的是旧版本。我升级到最新版本,并且可以使用。因此,我修改了您的答案,使其更清楚(将您的评论移至顶部),并+1了您!谢谢!!
湿婆

这样有效!使用简单的bash脚本导出csv,现在我可以输入年,月,周等的列了。喜欢它。
杰米·泰勒

1
@EdRandall:如果您指的是%X,~~我只是在我的机器上尝试过,肯定会在我所在的时区计时。~~嗯,现在我不确定。我从不在我所在时区的某人克隆了一个仓库,然后重试。我想我只是使用当前的语言环境设置来格式化时间,但是时区被关闭了。
Ben Allred

36

经过很长时间的寻找以某种git log格式输出日期YYYY-MM-DD的方法之后less,我想到了以下格式:

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

连同开关--date=iso

这将以ISO格式(长格式)打印日期,然后打印14倍的退格字符(0x08),这在我的终端机中有效地删除了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.
...

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

2
这对我来说很好。使用%x08的6会为我完全删除尾随时区。
Penghe Geng 2013年

7
怎么样--date=short shows only date but not time, in YYYY-MM-DD format.
Paaske 2014年

3
在zsh和bash中,这显示了您在终端上的输出,但是如果将其通过管道传输到任何内容中,“后退”数据仍然存在。这意味着类似的东西| sort | uniq不起作用。
chmac 2014年

5
这既荒谬又令人敬畏。我%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)用来获取格式2015-01-19 11:27 (11 days)。+1
naught101

2
现在这个答案stackoverflow.com/a/34778736/907576更合适(因为Git v2.6.0-rc0)
radistao 2016年

25

您可以使用字段截断选项来避免使用太多%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>'

我只是注意到相对于原始帖子来说这有点循环,但是如果其他人使用与我相同的搜索参数到达这里,我会保留它。


23

我需要同样的东西,发现以下对我有用:

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

--date=format其中格式化日期输出--pretty告诉打印什么。


2
这对我不起作用。我得到“未知的日期格式”

您有哪个版本的git?
lac_dev 2016年


git log --pretty=format:"%h%x09%cd%x09%s" --date=format:'%Y-%m-%d %H:%M:%S %p'
业余咖啡师,2017年

没有显示最后提交的@amateurbarista,请阅读请求。ar3试图显示最后的提交,而不是最后几个提交。
lac_dev

16

请注意“ date=iso”格式:它不完全是 ISO 8601
请参阅Beat Bolli()中的提交“ 466fb67bbolli,适用于Git 2.2.0(2014年11月)

漂亮:提供严格的ISO 8601日期格式

由于存在微小差异,Git的“ ISO”日期格式实际上不符合ISO 8601标准,并且不能由仅ISO 8601的解析器(例如XML工具链的解析器)解析。

--date=iso” 的输出以下列方式偏离ISO 8601:

  • 用空格代替T日期/时间定界符
  • 时区和时区之间的空间
  • 时区的小时和分钟之间没有冒号

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

请参阅此线程进行讨论。


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

请注意,如果对您的用例很重要,它将转换为您的本地时区。


谢谢。我用%ct进行了调整
卡尼(Cagney)'16

5

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参考

现在,您可以使用本地时区要求任何日期格式。看到

参见Jeff King()的commit add00ba547ed71(2015年9月3日(通过合并JUNIOÇ滨野- -提交7b09c45peff
gitster,2015年10月5日)

特别是上面的最后一个(commit add00ba)提到:

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

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

该补丁local向“ struct date_mode” 添加了一个“ ”布尔字段,并DATE_LOCALdate_mode_type枚举中删除了该元素(现在只是DATE_NORMALplus local=1)。
用户可以通过-local在任何日期模式(例如“ iso-local”)中添加“ ”来使用该新功能,并且为了向后兼容,我们保留“ local”作为“ ”的别名default-local


2
我也必须注意format-local作品!因此,将喜欢的格式和本地格式之间的功能融合在一起是非常完美的。
激进分子'18

5

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

%ai:作者日期,类似于ISO 8601的格式

--format="%ai"

5

我需要特殊格式的日期。

在Git 2.21(2019年第一季度)中,引入了一种新的日期格式“ --date=human”,格式会根据时间与当前时间相差多少来改变其输出

--date=auto当输出将发送到寻呼机或终端时,可以使用 ”来使用这种新格式,否则可以使用默认格式。

请参阅Stephen P.Smith (``)的提交110a6a1提交b841d4f(2019年1月29日)和提交038a878提交2fd7c22(2019年1月21日
参见Linus Torvalds()的commit acdd377(2019年1月18日(由Junio C Hamano合并--commit ecbe1be中,2019年2月7日)torvalds
gitster

添加“人类”日期格式文档

以类似于人们在其他上下文中写日期的格式显示日期和时间信息。
如果未指定年份,则读者将推断给出的日期为当前年份

通过不显示冗余信息,阅读器将精力集中在不同的信息上
修补程序根据从执行git命令时运行命令的计算机上的日期推断的信息报告相对日期。

尽管该格式通过删除推断的信息对人类更有用,但没有任何东西可以使它真正成为人类。
如果relative尚未实现' '日期格式,那么使用' relative'将是适当的。

添加human日期格式测试。

使用human时,根据参考日期和本地计算机日期之间的时间差,会禁止显示多个字段。

  • 如果差异小于一年,则年份字段将被抑制。
  • 如果时间少于一天;月份和年份被抑制。
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

##将建议的' auto'模式替换为' auto:'

除了添加' human'格式外,补丁还添加了auto关键字,该关键字可以在配置文件中用作指定人工格式的替代方法。删除“自动”将清理“ human”格式界面。

foo如果使用auto:foo语法使用寻呼机,则添加了指定模式' '的功能。
因此,如果我们使用的是寻呼机,则' auto:human'日期模式默认为human
因此,您可以执行以下操作:

git config --add log.date auto:human

git log除非您编写脚本,否则您的“ ”命令将显示清晰易懂的格式。


Git 2.24(Q4 2019)简化了代码。

参见Stephen P.Smith的commit 47b27c9commit 29f4332(2019年9月12日)(``)
(由Junio C gitsterHamano合并--commit 36​​d2fca中,2019年10月7日)

退出传递“现在”到日期代码

提交b841d4f(将human格式添加到测试工具,2019-01-28,Git v2.21.0-rc0)添加了一个get_time()功能,该功能允许$GIT_TEST_DATE_NOW在环境中覆盖当前时间。
因此,我们不再需要在cmd__date()

因此,我们可以停止通过nowdate函数向下传递“ ”参数,因为没有人使用它们。
请注意,我们确实需要确保所有以前带有“ now”参数的调用者都正确使用了get_time()


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

关心详细吗?另外,您的答案已经具有作者字段和历史记录。无需签名。
Kissaki 2014年

2

使用Bash和date命令将类似ISO的格式转换为所需的格式。我想要一种组织模式日期格式(和列表项),所以我这样做了:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.