12

是否有任何关于传递给 git 的日期语法的规范?例如,“git rev-list”的“--before”选项接受哪些日期?

假设没有这样的规范,有没有办法让 git 将日期转换为规范形式,以便可以检查给定的日期字符串是否被解释为预期的那样?(更新:我已经编写了一个脚本来执行此操作,可 在此处获得。)

信息说明:日期解析似乎是在文件 date.c 中实现的,位于 git 存储库的根目录中。“入口点”似乎是一个名为 approxidate_careful 的函数。

4

6 回答 6

6

据我所知,它没有在任何地方明确指出,但它似乎接受它可以输出的所有格式,如--date选项文档中所述:

--date=(relative|local|default|iso|rfc|short|raw)

仅对以人类可读格式显示的日期生效,例如使用 --pretty. log.dateconfig 变量设置日志命令--date选项的默认值。

--date=relative显示相对于当前时间的日期,例如“2 小时前”。

--date=local显示用户本地时区的时间戳。

--date=iso(或--date=iso8601)以 ISO 8601 格式显示时间戳。

--date=rfc(或--date=rfc2822)以 RFC 2822 格式显示时间戳,通常在电子邮件消息中找到。

--date=shortYYYY-MM-DD以格式仅显示日期而不显示时间。

--date=raw以内部原始 git 格式显示日期%s %z

--date=default显示原始时区中的时间戳(提交者或作者的)。

于 2012-12-24T20:19:16.393 回答
4

正如您已经发现的那样,git 通常使用 approxidate 来解析各种时间。这使您可以编写各种自然到疯狂的方式来指定时间。

这使您可以编写诸如“六分钟前”或“上周二”甚至“下午茶时间”之类的内容,并且通常可以理解您的意思。除了您已经找到的来源之外,我不知道任何明确的文档。

关于该主题的一个不错的博客条目是http://www.alexpeattie.com/blog/working-with-dates-in-git/

于 2012-12-24T17:25:11.310 回答
2

可悲的是,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_DATEGIT_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.DDMM/DD/YYYYDD.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>
于 2012-12-26T23:19:18.977 回答
2

真正的代码位于https://github.com/git/git/blob/master/date.c#L717并枚举了可用的格式,例如 iso8601、rfc2822 和各种短格式、本地格式、原始格式和默认格式。

于 2012-12-24T17:54:59.980 回答
1

请注意, " date=iso" 格式并不完全是 ISO 8601。对于 Git 2.2.0(2014 年 11 月),请参阅Beat Bolli ( )
中的 提交“ 466fb67bbolli

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' 日期格式名称。

请参阅此线程进行讨论。

于 2014-11-16T20:24:33.103 回答
0

Git 2.2.2(2015 年 1 月)在尝试在dd/mm/yymm/dd/yy.

请参阅Jeff King编写的提交 d372395 ( )peff

approximate: 允许类似 ISO 的日期在很远的将来

当我们解析近似字符串时,我们发现三个数字由一个“ :/-.”隔开,我们猜测它可能是一个日期。
我们将数字提供给,它会检查它作为各种顺序(例如,或等)match_multi_number中的日期是否有意义。dd/mm/yymm/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/yyyymm/dd/yyyy查找,因为此代码路径仅在第一个数字大于 70 时才会启动(即,它必须是一年,不能是日期或月份)。

一个可能的伤亡是“ yyyy-dd-mm”不太可能被选中而不是“ yyyy-mm-dd”。这可能没关系,但因为:

  1. 仅当日期在未来时才会发生差异。我们已经更喜欢yyyy-mm-dd过去的日期。
  2. 目前还不清楚是否有人yyyy-dd-mm经常使用。它没有出现在 Wikipedia的常见日期格式列表中
  3. 即使 (2) 是错误的,最好选择类似 ISO 的日期,因为这与我们在 git 其他地方使用的一致。
于 2015-01-31T21:12:48.733 回答