如何让 git 在指定的日期范围内显示作者日期的提交?

显然 这个:

git log --all --after="<date> 00:00" --before="<date> 23:59" --author="<author>"

基于 committer date的过滤器提交。我如何让它显示指定作者日期范围的提交?

78555 次浏览

你不能ーー至少不能单独使用 Git。(提醒其他访问这个问题的人: 它不是关于 观看的作者日期,它是关于 选择提交的作者日期,a la --since/--after--until/--before。这些选择器使用 委员日期,而不是作者日期。作为一个极端的例子,我们考虑一个“ now”提交,因此它的提交日期是2000年代,但是在 author-date 字段中回溯到1999年的某一天。如果您的选择范围是“接近世纪之交的任何时候”,您将取消选择此提交,因为它的提交日期是“现在”,比1999年晚了十多年。)

我认为这是 Git 中的一个小错误: 您应该能够请求它在任何您可以请求它使用提交者日期字段的地方使用作者日期字段。这是很容易与 日志格式化日志格式化,因为我们有 %ad%cd等,但不可能与 提交选择。最接近的是 git rev-list可以按照作者日期排序(在一般的拓扑排序中)。

git rev-list中的全局开关,如 --use-author-date,可以作为一个简单的补丁工作,并且不会太难添加到 Git 中,但是我认为最好有 --min-author-age--max-author-age或类似的,以及一个“作者日期排序”标志(独立于一般的 --topo-order标志,因此设置 both标志具有与 --author-date-order相同的效果)。

作为一种解决方案,您可以列出所有潜在有趣的提交(使用 git rev-list或等价物,例如 git log: 使用任何使提交潜在有趣的说明符,除了日期过滤器: 在这种情况下,这只是 --all) ,并提取其所有的作者日期字段(使用 git log --format=%at或其他) ,然后自己对提交 ID 列表进行修剪,然后将剩余的提交 ID 重新提交到 git log --no-walk。但这充其量是痛苦的。有关更多信息,请参见 Tim Beigeleisen's answer using awk

可以

但是正如@torek 所提到的,您可能无法使用纯 Git 实现这一点。一种选择是将一些漂亮的格式输出从 git log导入到 awk,并检查作者日期:

git log --date=iso --pretty=format:'%ad%x08%aN' | awk '$0 >= "2013-01-01" && $0 <= "2013-12-01"'

在这里,%ad以 ISO 格式提供作者日期,而 %aN提供作者姓名。

也许我遗漏了什么,但这还不够吗?

git log --pretty=format:"%ad - %an: %s" --after="2016-01-31" --until="2017-03-10" --author="John Doe"

See also 给你

受到 Tim Biegeleisen 上述回答的启发。

git log --all --date=iso --pretty=format:'%ad%x08%aN %s' | grep 2020-06-09 | sort -u

做了我需要做的。我想要作者的日期,而不是提交日期,因为我基础和压缩了很多。但是我在导入提交时保留了重要的日期。

与此相关的,我有一个小助手允许我重置作者的电子邮件,但保留原作者的日期。——重置作者默认覆盖作者的日期。

https://github.com/mathieujobin/git-scripts/blob/master/bin/git-reset-author-but-not-date

在上面的 git 日志中,如果需要,可以添加 %H来获得 gitsha

For those looking for a quick copy-and-paste solution:

git log --pretty='%aI %H' | \
awk '$1 >= "<after-date>" && $1 <= "<before-date>" { print $2 }' | \
git log --no-walk --stdin

备注:

  • <after-date><before-date>部分可以根据需要停止
  • Dates must be in strict ISO format (YYYY-MM-DDThh:mm:ss e.g. 2021-04-20T13:30:00)
  • 日期可能被截断,但与 --after/--before类似,它们总是四舍五入到一个确切的时间。因此,要查找某一天的所有提交,例如,需要下列操作之一:
    • $1 >= "2021-04-20T00:00:00" && $1 <= "2021-04-20T23:59:59"
    • $1 >= "2021-04-20" && $1 < "2021-04-21"(注意 <而不是 <=)
  • 日期比较不考虑时区。如果回购提交来自不同的时区,你需要精度,使用你的本地时区与 git log --date=iso-strict-local --pretty='%ad %H',或者你可以指定日期的 unix 时间戳和使用 %at

基于 Torekthis answer,这也是由 Mr_and_Mrs_DTim Biegeleisen(都涉及到这个问题)所贡献的。