问题描述
有人知道为什么 before
包括完成日期吗?
日期 2021-07-01 14:13
实际上是在 2021-07-01
之后
为什么结果是错误的?
git 版本是 2.32.0
解决方法
注意日期过滤器使用提交日期时间,而不是作者日期时间。
虽然它没有记录,如 jthill's answer 中所述,并通过我有限的测试证实,但令人惊讶的是,当未指定时间时,似乎所有日期过滤器都指的是当天的当前时间在您的客户端机器上!请注意,如果您想覆盖它,您可以指定一个时间:
git log --before=2021-07-02T23:59:59
(一天结束)
或
git log --before=2021-07-02T00:00:00
(一天的开始)
下面是我的测试脚本。它生成一个新的 repo,其中包含一个空提交,提交者日期为 2 天前减去 1 分钟。 (因此,从现在起 1 分钟后,提交将恰好是 2 天前。)然后脚本循环一分钟,每 10 秒打印一次当前时间,以及使用 --before
和 {{1 }} 选项。起初 --before 不显示任何内容, --after 显示提交,但一分钟后,一旦当前时间超过提交日期,日志就会翻转:
--after
,
如果您没有在截止时间指定时间,它会使用当前挂钟,所以 --before=yesterday
在下午 5 点询问意味着昨天下午 5 点之前。如果要指定午夜,请添加 T00:00
、--before=yesterday.T00:00
。我认为这足够令人惊讶,可以算作一个成熟的疣,就像 find
的大小行为一样。不幸的是,这被核心命令使用,即所谓的“管道”,并且 Git 已明确向脚本编写者承诺他们的行为以及此日期解析疣不会改变。
编辑:试试这个:
unset head; for h in {0..23}; do
head=$( GIT_COMMITTER_DATE=`date -d yesterday\ T$h:00` \
git commit-tree ${head+-p $head} -m - @: )
done
git log -1 --pretty=fuller $head
git log -1 --pretty=fuller --before=yesterday $head
你会看到 before=yesterday
选择了当前挂钟之前提交时间戳的那个。