是否有任何关于传递给 git 的日期语法的规范?例如,“git rev-list”的“--before”选项接受哪些日期?
假设没有这样的规范,有没有办法让 git 将日期转换为规范形式,以便可以检查给定的日期字符串是否被解释为预期的那样?(更新:我已经编写了一个脚本来执行此操作,可 在此处获得。)
信息说明:日期解析似乎是在文件 date.c 中实现的,位于 git 存储库的根目录中。“入口点”似乎是一个名为 approxidate_careful 的函数。
据我所知,它没有在任何地方明确指出,但它似乎接受它可以输出的所有格式,如--date
选项文档中所述:
--date=(relative|local|default|iso|rfc|short|raw)
仅对以人类可读格式显示的日期生效,例如使用
--pretty
.log.date
config 变量设置日志命令--date
选项的默认值。
--date=relative
显示相对于当前时间的日期,例如“2 小时前”。
--date=local
显示用户本地时区的时间戳。
--date=iso
(或--date=iso8601
)以 ISO 8601 格式显示时间戳。
--date=rfc
(或--date=rfc2822
)以 RFC 2822 格式显示时间戳,通常在电子邮件消息中找到。
--date=short
YYYY-MM-DD
以格式仅显示日期而不显示时间。
--date=raw
以内部原始 git 格式显示日期%s %z
。
--date=default
显示原始时区中的时间戳(提交者或作者的)。
正如您已经发现的那样,git 通常使用 approxidate 来解析各种时间。这使您可以编写各种自然到疯狂的方式来指定时间。
这使您可以编写诸如“六分钟前”或“上周二”甚至“下午茶时间”之类的内容,并且通常可以理解您的意思。除了您已经找到的来源之外,我不知道任何明确的文档。
关于该主题的一个不错的博客条目是http://www.alexpeattie.com/blog/working-with-dates-in-git/
可悲的是,Git 对于它接受的日期和时间格式并不一致。内部规范格式是 Unix 时间戳(即自 1970 年 1 月 1 日午夜以来的秒数)和时区偏移量的组合。
对于指定日期,这有点难以阅读。我会使用 Git 对ISO 8601的解释来获得一种相对容易阅读且始终明确的格式。根据您使用的命令,您通常可以使用minitech 所--date=iso
指出的来获得它。它看起来像. 2012-12-26 23:17:23 +0000
(该--date=rfc
版本同样明确,因为它只会以相同的方式解释,但包括工作日。我个人反对这样做,因为它允许您指定看起来有效但日期不匹配的日期日期,例如Sun, 26 Dec 2012 01:02:03 +0000
[那是今天,星期三]。)
对于我相信无处不在的格式,运行git help commit-tree
;该手册页包括以下内容(我已经稍微重新格式化):
日期格式
,环境变量支持以下日期格式
GIT_AUTHOR_DATE
:GIT_COMMITTER_DATE
Git 内部格式:它是
<unix timestamp> <timezone offset>
,其中<unix timestamp>
是自 UNIX emoch 以来的秒数。<timezone offset>
是与 UTC 的正偏移或负偏移。例如 CET(比 UTC 提前两个小时)是+0200
.RFC 2822:RFC 2822描述的标准电子邮件格式,例如
Thu, 07 Apr 2005 22:13:13 +0200
.ISO 8601: ISO 8601标准指定的时间和日期,例如
2005-04-07T22:13:13
. 解析器也接受空格而不是T
字符。注意:此外,日期部分接受以下格式
YYYY.MM.DD
:MM/DD/YYYY
和DD.MM.YYYY
。
正如michas 所 指出的,有些地方使用“近似”,因此不那么挑剔。如果您想深入研究,代码在 Git 中date.c
(该链接通过在 Git 中使用日期链接 michas 发布)。例如,以下来自git help revisions
:
指定修订
…</p>
<refname>@{<date>}
master@{yesterday}
,例如HEAD@{5 minutes ago}
: 后缀后缀的 ref@
带有括在大括号对中的日期规范(例如{yesterday}
,{1 month 2 weeks 3 days 1 hour 1 second ago}
或 `{1979-02-26 18:30:00})指定 ref 在先前时间点的值。…</li>
真正的代码位于https://github.com/git/git/blob/master/date.c#L717并枚举了可用的格式,例如 iso8601、rfc2822 和各种短格式、本地格式、原始格式和默认格式。
请注意, " date=iso
" 格式并不完全是 ISO 8601。对于 Git 2.2.0(2014 年 11 月),请参阅Beat Bolli ( )
中的
提交“ 466fb67 ”bbolli
由于细微的差异,Git 的“ISO”日期格式并不真正符合 ISO 8601 标准,并且它不能被仅限 ISO 8601 的解析器解析,例如 XML 工具链的解析器。
" " 的输出
--date=iso
以下列方式偏离 ISO 8601:
- 一个空格而不是
T
日期/时间分隔符- 时间和时区之间的空间
- 时区的小时和分钟之间没有冒号
添加严格的 ISO 8601 日期格式以显示提交者和作者日期。
使用 '%aI
' 和 '%cI
' 格式说明符并添加 '--date=iso-strict
' 或 '--date=iso8601-strict
' 日期格式名称。请参阅此线程进行讨论。
Git 2.2.2(2015 年 1 月)在尝试在dd/mm/yy
或mm/dd/yy
.
请参阅Jeff King编写的提交 d372395 ( )peff
approximate: 允许类似 ISO 的日期在很远的将来
当我们解析近似字符串时,我们发现三个数字由一个“
:/-.
”隔开,我们猜测它可能是一个日期。
我们将数字提供给,它会检查它作为各种顺序(例如,或等)match_multi_number
中的日期是否有意义。dd/mm/yy
mm/dd/yy
我们所做的一项检查是查看它是否是未来 10 天以上的日期。这是在38035cf 中添加的(日期解析:对我们的欧洲朋友更友好。,2006-04-05,Git 1.3.0),让我们猜测如果现在是 2014 年 4 月,那么“
10/03/2014
”可能是 3 月 10 日,而不是10 月 3 日。不过,这有一个缺点。如果您想对您的“
--until
”日期规范过于慷慨,我们可能会错误地将“”解析2014-12-01
为“2014-01-12
”(因为后者是过去的日期)。
如果这一年是未来的一年(即,两者都是未来的日期),那就更奇怪了。由于近似值的变幻莫测,当前日期后的几个月(无论年份)都会翻转,但之前的日期不会。此补丁删除了对这种形式的日期的“未来”检查,让我们始终将它们视为
yyyy-mm-dd
,即使它们在未来。
这不会影响正常dd/mm/yyyy
与mm/dd/yyyy
查找,因为此代码路径仅在第一个数字大于 70 时才会启动(即,它必须是一年,不能是日期或月份)。一个可能的伤亡是“
yyyy-dd-mm
”不太可能被选中而不是“yyyy-mm-dd
”。这可能没关系,但因为:
- 仅当日期在未来时才会发生差异。我们已经更喜欢
yyyy-mm-dd
过去的日期。- 目前还不清楚是否有人
yyyy-dd-mm
经常使用。它没有出现在 Wikipedia的常见日期格式列表中 。- 即使 (2) 是错误的,最好选择类似 ISO 的日期,因为这与我们在 git 其他地方使用的一致。