有谁知道为什么“之前”包括完成日期?

问题描述

有人知道为什么 before 包括完成日期吗?

日期 2021-07-01 14:13 实际上是在 2021-07-01 之后

enter image description here

为什么结果是错误的?

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 选择了当前挂钟之前提交时间戳的那个。