如何更改 Git 日志日期格式

Posted

技术标签:

【中文标题】如何更改 Git 日志日期格式【英文标题】:How to change Git log date formats 【发布时间】:2011-12-12 19:00:01 【问题描述】:

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

【问题讨论】:

我总是发现official Linux Kernel Git documentation 是解决这类问题的绝佳资源。 注意:你现在(2014 年 11 月,Git 2.2)拥有--date=iso-strict:见my answer below 使用 git 2.7(2015 年第四季度),您可以要求将 本地时区 用于任何日期格式!见my answer below。这意味着,除了--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) 相关:How can one change the timestamp of an old commit in Git? 【参考方案1】:

我需要特殊格式的日期。

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

"--date=auto" 可用于在输出到寻呼机或终端时使用这种新格式,否则使用默认格式。

请参阅commit 110a6a1、commit b841d4f(2019 年 1 月 29 日)和 commit 038a878、commit 2fd7c22(2019 年 1 月 21 日)Stephen P. Smith (``)。 请参阅 Linus Torvalds (torvalds) 的 commit acdd377(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 关键字,可在配置文件中用作指定人工格式的替代方式。删除“auto”会清理“human”格式界面。

添加了在使用 auto:foo 语法使用寻呼机时指定模式“foo”的功能。 因此,如果我们使用寻呼机,“auto:human”日期模式默认为human。 所以你可以这样做:

git config --add log.date auto:human

并且您的“git log”命令将显示人类可读的格式,除非 你正在编写脚本。


Git 2.24(2019 年第四季度)简化了代码。

参见commit 47b27c9、commit 29f4332(2019 年 9 月 12 日)Stephen P. Smith (``)。(由 Junio C Hamano -- gitster -- 合并到 commit 36d2fca,2019 年 10 月 7 日)

停止将“现在”传递给日期代码

Commit b841d4f (Add human format to test-tool, 2019-01-28, Git v2.21.0-rc0) 添加了get_time() 函数,允许环境中的$GIT_TEST_DATE_NOW 覆盖当前时间. 所以我们不再需要在cmd__date() 中解释那个变量。

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


在 Git 2.32(2021 年第二季度)中,“git log --format=...(man) 占位符学习了 %ah/%ch 占位符来请求 --date=human 输出。

参见 ZheNing Hu (adlternative) 的 commit b722d45(2021 年 4 月 25 日)。(由 Junio C Hamano -- gitster -- 合并到 commit f16a466,2021 年 5 月 7 日)

pretty: 提供人类日期格式

签字人:胡哲宁

添加占位符 %ah%ch 以格式化作者日期和提交者日期,就像 --date=human 所做的那样,提供更多人性化的日期输出。

pretty-formats 现在包含在其man page 中:

'%ah':: 作者日期,人类风格(如--date=human 选项 git rev-list)

pretty-formats 现在包含在其man page 中:

'%ch':: 提交者日期,人类风格(如--date=human 选项 git rev-list)

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

这对我不起作用。我得到“未知日期格式” 你有哪个版本的git? 使用medium.com/@katopz/how-to-upgrade-git-ff00ea12be18更新 git log --pretty=format:"%h%x09%cd%x09%s" --date=format:'%Y-%m-%d %H:%M:%S %p' @amaturbarista 没有显示最后一次提交,请阅读请求。 ar3 试图显示最后一次提交,而不是最后几次提交。【参考方案3】:

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

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

在搜索这方面的文档时,我发现了a commit to Git itself,这表明该格式直接提供给strftime。查找 strftime(here 或 here)我找到的占位符与列出的占位符匹配。

占位符包括:

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

【讨论】:

@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'" 谢谢本!我按原样粘贴了您的命令并运行了git lg,但仍然出现以下错误。 fatal: unknown date format format:%Y-%m-%d %H:%M:%S。我在 Windows 上运行 git。这是我的 git 版本。 git version 1.9.5.msysgit.1。那么我必须升级到较新的版本吗? 嗨,本,我使用的是旧版本。我升级到最新版本,这有效。因此,我编辑了您的答案以使其更清晰(将您的评论移至顶部)并且还为您 +1!谢谢!! @EdRandall:如果你指的是%X,~~我刚刚在我的机器上尝试过,肯定会在我的时区得到时间。~~嗯,现在我不确定了。我从不在我所在时区的人那里克隆了一个 repo 并再次尝试。我想我只是使用当前的语言环境设置格式化时间,但时区被取消了。 如何将--date=format:'%Y-%m-%d %H:%M:%S' 放入.gitconfig 中?【参考方案4】:

使用 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

【讨论】:

【参考方案5】:

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

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

--format="%ai"

【讨论】:

【参考方案6】:

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

【讨论】:

如果你想要永久效果而不是每次都输入这个,试试git config log.date iso之类的东西,或者,为了影响你使用这个帐户git config --global log.date iso的所有git使用 您可以使用自己的格式。 请参阅Ben Allred's answer。 --format:<args> 会将 <args> 传递给 strftime。【参考方案7】:

您可以使用字段截断选项来避免太多%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=&lt;format&gt;,所以如果你想要 YYYY-MM-DD,你可以这样做并完全避免 %&lt;%x08

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

我只是注意到这与原始帖子相比有点循环,但我会留下它,以防其他人使用与我相同的搜索参数到达这里。

【讨论】:

【参考方案8】:

在寻找一种方法让git logYYYY-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'

【讨论】:

这对我来说效果很好。使用 6 of %x08 完全删除了我的尾随时区。 --date=short shows only date but not time, in YYYY-MM-DD format.怎么样 在 zsh 和 bash 中,这显示了您在终端上的输出,但如果您将其通过管道传输到任何内容中,“退格”数据仍然存在。这意味着像 | sort | uniq 这样的东西不起作用。 这既荒谬又令人敬畏。我正在使用%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 现在这个答案***.com/a/34778736/907576 更合适(从Git v2.6.0-rc0 开始)【参考方案9】:

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 一起使用。 Reference.

您现在可以要求使用当地时区的任何日期格式。 见

commit 99264e9, commit db7bae2, commit dc6d782, commit f3c1ba5, commit f95cecf, commit 4b1c5e1, commit 8f50d26, commit 78a8441, commit 2df4e29(2015 年 9 月 3 日)John Keeping (johnkeeping)。

参见commit add00ba、commit 547ed71(2015 年 9 月 3 日)Jeff King (peff)。(由 Junio C Hamano -- gitster -- 合并到 commit 7b09c45,2015 年 10 月 5 日)

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

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

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

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

【讨论】:

我必须注意format-local 也有效!所以将喜欢的格式和本地的力量融合在一起是非常完美的。【参考方案10】:

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

pretty:提供严格的 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 进行讨论。

【讨论】:

【参考方案11】:
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]"

【讨论】:

想详细说明一下?此外,您的答案已经有作者字段和历史记录。无需签名。【参考方案12】:
date -d @$(git log -n1 --format="%at") +%Y%m%d%H%M

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

【讨论】:

谢谢。我用 %ct 调整了它

以上是关于如何更改 Git 日志日期格式的主要内容,如果未能解决你的问题,请参考以下文章

更改 Wildfly(JBoss) 访问日志中的日期格式

如何更改excel中的默认日期格式

如何更改日期范围选择器的日期格式?

如何从数组更改日期格式

怎么更改电脑日期格式

如何使用 HIVE 以其他格式更改或修改日期列值