为什么git log - 因为不包括我期望的提交?

时间:2017-01-07 03:26:06

标签: git git-log

我想从年初开始获取a repository的所有提交列表。我尝试了明显的命令,但它并没有包括任何一个:

$ git log --pretty='format:%h %ae %cI %s' --author=cam@mcc.id.au --since=2017-01-01
$

奇怪的是,我必须使用--since=2016-12-19,这会让我得到一些:

$ git log --pretty='format:%h %ae %cI %s' --author=cam@mcc.id.au --since=2016-12-20
$ git log --pretty='format:%h %ae %cI %s' --author=cam@mcc.id.au --since=2016-12-19
61569b5 cam@mcc.id.au 2017-01-02T16:25:22+08:00 Bug 1324624 - Tweak stylo crashtest assertion annotations a bit more.
7fca5ff cam@mcc.id.au 2016-12-29T16:32:01+08:00 Bug 1323892 - Followup to disable one more crashtest under stylo.
cd875e7 cam@mcc.id.au 2016-12-28T17:50:44+08:00 Bug 1326023 - Make Element::GetBindingURL return a strong reference. r=smaug
3c057d1 cam@mcc.id.au 2017-01-02T15:44:23+08:00 Bug 1323717 - Re-enable 1290994-4.html. r=manishearth
7a45228 cam@mcc.id.au 2016-12-28T17:50:44+08:00 Bug 1326023 - Make Element::GetBindingURL return a strong reference. r=smaug
171e45e cam@mcc.id.au 2017-01-03T18:35:15+08:00 Bug 1328223 - stylo: Ignore invalid URLs from @import rules. r=emilio
$

但并非所有这些都是:

$ git log --pretty='format:%h %ae %cI %s' --author=cam@mcc.id.au | grep 2017- | wc -l
19

这里发生了什么? --since除了从输出中删除早于给定日期的提交外,是否还要执行某些操作?

2 个答案:

答案 0 :(得分:1)

无论好坏(我,我处于“更糟糕的”阵营),当您指定日期时,git默认为当前时间。试试--since='midnight 2016-12-20'

......好的我还没有解密代码,但这看起来非常好:

~/src/gecko-dev$ lgdo @ --pretty=%h%x09%aI%x09%cI%x09%ae
*   1e82e8d0792b        2017-01-06T10:59:19-05:00       2017-01-06T10:59:19-05:00       ihsiao@mozilla.com
|\  
| * cddd3c28b212        2017-01-06T22:10:08+11:00       2017-01-06T22:10:08+11:00       me@upsuper.org
| * c337ff9019fb        2016-11-21T15:58:37-08:00       2016-11-21T15:58:37-08:00       olucafont6@yahoo.com
| * aa46f91d69e7        2017-01-05T17:14:46+01:00       2017-01-05T17:14:46+01:00       benj@benj.me
| * d1ef4e265960        2017-01-06T21:12:08+11:00       2017-01-06T21:12:08+11:00       me@upsuper.org
| * 76040295f609        2017-01-06T21:12:08+11:00       2017-01-06T21:12:08+11:00       me@upsuper.org
| * 1b2b0886c923        2017-01-06T21:12:08+11:00       2017-01-06T21:12:08+11:00       me@upsuper.org
| * 41782ed8bfb7        2017-01-06T15:30:31+08:00       2017-01-06T15:30:31+08:00       cam@mcc.id.au
| * 318a182e13bb        2017-01-06T15:29:47+08:00       2017-01-06T15:29:47+08:00       cam@mcc.id.au
| * b54b74578c69        2017-01-06T15:21:19+08:00       2017-01-06T15:21:19+08:00       cam@mcc.id.au
| * 076ab8862963        2017-01-06T15:05:24+08:00       2017-01-06T15:05:24+08:00       cam@mcc.id.au
| * 13ce7a2e81b0        2017-01-06T15:05:24+08:00       2017-01-06T15:05:24+08:00       cam@mcc.id.au

请注意,您的提交已落后于提交c337ff9,日期为2016-11-21。我打赌那里有某种启发式方法,如果遇到截止日期超过一个月的提交,就会停止查看。

答案 1 :(得分:0)

还有一些注意事项,值得注意的是:

  1. Git使用提交日期,而不是作者日期,用于最小和最大年龄参数(至少当前接近2.12来源)。当使用revs->max_age时,来自近似解析器的输出进入--since(否则只是-1)。这应该记录下来,我不确定较旧的Git版本是否做同样的事情。

  2. 如果设置revs->limited,则会调用函数limit_revs,该函数会将UNINTERESTING标志从父提交传播到其子项。当一个提交超过UNINTERESTING设置时,max_age标志也会设置。这将修改提交的所有子节点以及稍后的提交日期。但是,revs->limited实际上不应在此处设置,因为它是通过提交限制操作(例如包括--ancestry-path--simplify-by-decoration)启用的。

  3. 内部函数get_revision_1 does something similar if revs->limited is not set, except that it doesn't even add the parent commits

  4. 即使提交日期通常不会减少,但假设它们不会减少,这似乎是不正确的,因为任何给定日期都可以强制特定的提交日期例如,提交 - 甚至是合并提交 - 通过GIT_COMMITTER_DATE环境变量。或者,即使没有恶意,计算机时钟也不总是正确的。如果有人在他们的计算机出于某种原因设置为1973年时合并其他人的工作,那么过去并没有让其他人工作。