94

我需要覆盖 git 的提交日期,所有文档都指向 --date 参数,但随后留下一个不知道适当格式的线索。我已经尝试了我能想到的所有排列,并且我得到了“致命的:无效的日期格式:”每一个错误。

4

4 回答 4

102

Git 2.6+(2015 年第三季度)添加了一个新选项。

请参阅Jeff King ( )的提交e4f031e ( 2015 年 6 月 30 日)和提交 aa1462c提交 a5481a6提交 b7c1e11(2015 年 6 月 25 日) 。(由Junio C Hamano 合并 -- --d939af1 提交中,2015 年 8 月 3 日)peff
gitster

引入“格式”日期模式

这会将格式直接提供给strftime.
除了更灵活一点之外,主要优点是您的系统 strftime可能会更多地了解您的区域设置的首选格式(例如,如何拼写星期几)。

--date=format:...将格式...提供给您的系统strftime
用于--date=format:%c以系统区域设置的首选格式显示日期。有关格式占位符的完整列表,
请参阅手册。strftime

Davide Cavestro在评论中提出了这个例子:

git commit -m "Test" --date=format:relative:5.hours.ago 

原始答案(2014 年中)

--date选项(在 2009 年 12 月的提交 02b47cd中引入,用于 git1.7.0)使用与 for 相同的格式GIT_AUTHOR_DATE,日期格式在提交 96b2d4f中测试:

在那里你可以看到接受的各种格式:

  • RFC2822:Mon, 3 Jul 2006 17:18:43 +0200
  • ISO8601:2006-07-03 17:18:43 +0200
  • 当地的:Mon Jul 3 15:18:43 2006
  • 简短:(2006-07-03不在 1.9.1 中,在 2.3.0 中有效)
  • 相对:参见提交 34dc6e7

    5.seconds.ago, 
    2.years.3.months.ago, 
    '6am yesterday'
    
  • raw:见commit 7dff9b3 (git 1.6.2, March 2009)
    internal raw git format - seconds since epoch plus timezone
    (换句话说:' date +"%s %z"'格式)

  • 默认:Mon Jul 3 17:18:43 2006 +0200

ADTC在评论中提问和回答:

它是否接受本地的 2006-07-03 15:18:43?

是的,它确实有效,它会自动采用本地时区。
使用这种格式,我不需要担心它是一周中的哪一天(Sun,,Mon等)。

于 2013-11-02T14:10:24.000 回答
8

日期格式在Documentation/date-formats.txt ( man git commit) 中记录不足,并且非常“人性化”地解析。

唯一可行的方法是阅读date.c下的源代码并尝试一下。

VonC 在 2.3.0 上未提及的要点:

  • 仅根据位数解析数字:

    • 2 位数字:19YY,对于 YY >= 73,当前月、日和时间。错误或当前日期,否则。

    • 4 位数字:YYYY,对于 YYYY >= 1973, <= 2099

    • > 8 位到某个小的限制(TODO 哪个?):UNIX 时间(自 1970 年以来的秒数)

  • @<digits> +0000: UNIX 时间。

    这似乎是直接进入 UNIX 时代的最佳方式。

    2**64 - 2 (TODO 为什么不是 -1 ?)是不会导致提交错误的最大值。戳记存储在一个 C long 中。

    git log显示非常大的值(在2^55TODO 附近的某个地方?)为 1970,即使git cat-file -p HEAD显示存储了正确的数字,所以它似乎是日期转换的限制。

    对于任何大于2**63 - 1,最大正符号 long 的东西,尝试推送到 GitHub 失败,结果为date causes integer overflow. GitHub 上那个日期的提交(由于某种原因,GitHub无法显示非常大的日期

    VonC 指出这是一种耻辱,因为它阻止了负日期是否可以将 git commit 设置为具有 1970 年之前的时间戳?这可用于将旧软件迁移到 Git。

  • tea: 今天 17 点 :-)

于 2015-03-26T22:08:41.213 回答
5

简单的例子:

GIT_AUTHOR_DATE='2015-04-19 17:18:43 +0200' GIT_COMMITTER_DATE='2015-04-19 17:18:43 +0200' git commit -m 'Commit message'
于 2019-04-24T18:00:06.747 回答
1

下面的缩写形式都可以工作:

  1. <month>/<day>
  2. <month>-<day>
  3. <day>.<month>

当没有歧义时,即<day>大于12,顺序<month> <day>无关紧要,分隔符可以是' /'、' -'或' .'中的任何一个。

否则,使用 ' .' 作为 的分隔符<day>.<month>,使用 ' /' 或 ' -'作为 的分隔符<month>-<day>

因此,“ 1.7”将被视为“7 月 1 日”,“ 1/7”将被视为“1 月 7 日”。

请参阅v1.3.0 中的相关提交

我们从#git 频道上的欧洲朋友那里了解到,dd.mm.yyyy 是那里的常态。

当分隔符为“.”时,我们更喜欢 dd.mm.yyyy 而不是 mm.dd.yyyy;否则 mm/dd/yy[yy] 优先于 dd/mm/yy[yy]。

这也适用于接受日期输入的其他命令,例如:显示自 2 月 4 日以来的日志:

git log --since 2/4
于 2020-07-21T16:55:08.933 回答