我需要覆盖 git 的提交日期,所有文档都指向 --date 参数,但随后留下一个不知道适当格式的线索。我已经尝试了我能想到的所有排列,并且我得到了“致命的:无效的日期格式:”每一个错误。
4 回答
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
它是否接受本地的 2006-07-03 15:18:43?
是的,它确实有效,它会自动采用本地时区。
使用这种格式,我不需要担心它是一周中的哪一天(Sun
,,Mon
等)。
日期格式在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^55
TODO 附近的某个地方?)为 1970,即使git cat-file -p HEAD
显示存储了正确的数字,所以它似乎是日期转换的限制。对于任何大于
2**63 - 1
,最大正符号 long 的东西,尝试推送到 GitHub 失败,结果为date causes integer overflow
. GitHub 上那个日期的提交(由于某种原因,GitHub无法显示非常大的日期)VonC 指出这是一种耻辱,因为它阻止了负日期是否可以将 git commit 设置为具有 1970 年之前的时间戳?这可用于将旧软件迁移到 Git。
tea
: 今天 17 点 :-)
简单的例子:
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'
下面的缩写形式都可以工作:
<month>/<day>
<month>-<day>
<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