如何更改Git日志日期格式

时间:2011-10-21 17:56:18

标签: git command-line

我正在尝试在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]"

12 个答案:

答案 0 :(得分:146)

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

我知道创建自定义格式没有内置方式,但你可以做一些shell魔术。

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

答案 1 :(得分:129)

除了--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 =格式:'%C(青色)%h%Creset%C(黑色粗体)%ad%Creset%C(自动)%d%s'“< / p>

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

在我搜索有关此问题的文档时,我发现a commit to Git itself表示格式直接提供给strftime。查找strftimeherehere)我找到的占位符与列出的占位符相匹配。

占位符包括:

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

答案 2 :(得分:35)

经过很长一段时间寻找一种让git log以[{1}}格式输出YYYY-MM-DD格式的方式的方法,我提出了以下格式:

less

以及开关%ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08

这将以ISO格式(长一个)打印日期,然后打印14次退格字符(0x08),在我的终端中,有效删除YYYY-MM-DD部分之后的所有内容。例如:

--date=iso

这就是:

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. ... 的别名,并对上面的格式进行一些调整。它显示左侧的提交图,然后是提交的哈希值,后跟日期,短名称,引用名和主题。别名如下(在〜/ .gitconfig中):

l

答案 3 :(得分:24)

您可以使用字段截断选项来避免使用很多%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,则可以执行此操作并避免%<和{{ 1}}完全:

%x08

我刚刚注意到这与原帖相比有些循环,但我会留下它,以防其他人来到这里,我的搜索参数相同。

答案 4 :(得分:18)

我需要同样的东西,并发现以下工作对我来说:

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

--date=format格式化--pretty告诉要打印的内容的日期输出。

答案 5 :(得分:14)

请注意“date=iso”格式:它不是完全 ISO 8601
请参阅466fb67中的提交“Beat Bolli (bbolli)”,了解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”日期格式名称。

请参阅this thread进行讨论。

答案 6 :(得分:11)

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

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

答案 7 :(得分:5)

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

  

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

--format="%ai"

答案 8 :(得分:4)

Git 2.7(2015年第4季度)将引入-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一起使用。 Reference

您现在可以使用本地时区询问任何日期格式。 见

commit add00ba查看commit 547ed71Jeff King (peff)(2015年9月3日) Junio C Hamano -- gitster --合并于commit 7b09c45,2015年10月5日)

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

  

date:make&#34; local&#34;与日期格式正交:

     

我们的大部分&#34; --date&#34;模式是关于日期的格式:我们显示的项目和顺序   但是&#34; --date=local&#34;有点奇怪。这意味着&#34;以正常格式显示日期,但使用当地时区&#34;。
  我们使用的时区与实际格式正交,我们没有理由不能将#8;本地化iso8601&#34;等等。

     

此补丁添加了&#34; local&#34;布尔字段为&#34; struct date_mode&#34;,并从DATE_LOCAL枚举中删除date_mode_type元素(它现在只有DATE_NORMAL加{{ 1}})。
  用户可以通过添加&#34; local=1&#34;来访问新功能。到任何日期模式(例如,&#34; -local&#34;),我们保留&#34; iso-local&#34;作为&#34; local&#34;的别名为了向后兼容。

答案 9 :(得分:3)

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

答案 10 :(得分:2)

使用Bash和date命令将类似ISO的格式转换为您想要的格式。我想要一个org-mode日期格式(和列表项),所以我这样做了:

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

答案 11 :(得分:1)

  

我需要特殊格式的日期。

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

--date=auto”可用于在输出进入寻呼机或终端或其他默认格式时使用此新格式。

请参见commit 110a6a1commit b841d4fcommit 038a878(2019年1月29日)和commit 2fd7c22Stephen P. Smith (``)(2019年1月21日)。
请参见commit acdd377Linus Torvalds (torvalds)(2019年1月18日)。
(由Junio C Hamano -- gitster --commit ecbe1be中合并,2019年2月7日)

  

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

     

以类似于人们在其他环境中写日期的格式显示日期和时间信息。
  If the year isn't specified then, the reader infers the date is given is in the current year

     

通过不显示冗余信息,读者可以专注于不同的信息
  补丁程序根据从执行命令时运行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”命令将显示易于理解的格式,除非   您正在编写脚本。