2

我有一个常规git reflog --date=iso显示很多条目的存储库,例如查看此片段https://gist.github.com/FreddieChopin/0206c9ef530a056c624b065eed048c9d

您可能会注意到,2 月 19 日、22 日、23 日、24 日、25 日和 26 日有 reflogs。

但是,如果我想将输出限制在某些日期,这将无法按预期工作。例如git reflog --date=iso --since="2017-02-20",仅给出此https://gist.github.com/FreddieChopin/fb7619dee8fde055a1cce6f6ff2f6eb6 - 它停在“52896f49 HEAD@{2017-02-24 20:53:29 +0100}”,即使自 20 日以来有 reflogs在那之前的二月。甚至还有 24 日的 reflogs 时间更短,所以我不知道为什么它会停在那里。

我检查过的另一个存储库也有同样的问题,所以这似乎与 reflog 本身有关,而不是特定的存储库。另一个 repo 的问题甚至更奇怪,例如git reflog --since="50.weeks"给出了我最近几天的提交,同时git reflog --since="60.weeks"开始更早地回到过去——在那个 repo 中,几年前也有定期提交。

另一方面,git log --since=...完全按预期工作,所以我不确定这里有什么问题......

4

1 回答 1

1

请注意,Git 2.14.x/2.15 已经修复了 reflog 的一些问题。
请参阅Jeff King ( )的提交 de23944提交 d08565b提交 7f97de5提交 7c2f08a提交 f35650d提交 82fd0f4提交 7cf686b(2017 年 7 月 7 日)和提交 822601e(2017 年 7 月 9 日) 。(由Junio C Hamano 合并——提交 3ab01ac中,2017 年 8 月 11 日)peff
gitster

reflog-walk: 应用 --since/--until 到 reflog 日期

在进行 reflog walk 时,我们使用提交的日期来进行任何日期限制。在早期版本的 Git 中,这可能会导致无意义的结果,因为跳过的提交会截断遍历。
所以一个像这样的序列:

git commit ...
git checkout week-old-branch
git checkout -
git log -g --since=1.day.ago

将停在一周大的分支,即使git commit后面的 " " 条目仍然很有趣。

从使用 reflog 的无父遍历的先前提交开始,您将获得整个 reflog 减去日期与指定选项不匹配的任何提交。
这可以说是有用的,因为您可以扫描 reflogs 以查找源自特定范围的提交。

但更有可能进行 reflog walk 的用户希望根据 reflog 条目本身进行限制。
你可以模拟--until

git log -g @{1.day.ago}

但是没有办法让 Git 只遍历到某个日期。例如:

# show me reflog entries from the past day
git log -g --since=1.day.ago

此补丁教导修订机制在进行 reflog walk 时更喜欢 reflog 条目日期而不是提交日期。
从技术上讲,这是一种影响管道的行为变化,但之前的行为非常有问题,不太可能有人依赖它。

reflog-walk为.

于 2017-08-13T19:40:17.493 回答