Cannot replay git bisect: "error: couldn't get the oid of the rev"

Cannot replay git bisect: "error: couldn't get the oid of the rev"

我正在尝试将编辑日志中的 git bisect 重播到我制作的 undo a mistake

我错误地将其中一个提交标记为好,而它应该是坏的(反之亦然)。我运行:

git bisect log > C:\temp\bisect.log
# Alternatively
git bisect log | Set-Content -Encoding ASCII C:\temp\bisect.log

然后我编辑了那个文件,删除了错误标记的提交和下面的所有行。

然后我运行:

git bisect reset
git bisect replay c:\temp\bisect.log

我现在收到错误消息:

We are not bisecting.
Bisecting: 5211 revisions left to test after this (roughly 12 steps)
[9bc79b2f25a3724376d7af19617c33749a30ea3a] Merge branch 'release/2.1' into release/2.2
error: couldn't get the oid of the rev '9bc79b2f25a3724376d7af19617c33749a30ea3a?'

这是怎么回事?我如何解决它? (为什么修改的末尾有'?'?)

我在 Windows 10 上使用 git 版本 2.26.2.windows.1。我使用 PowerShell 7 作为我的 shell.

git bisect replay in Git before version 2.27 无法处理 CRLF 分隔文件。最好的解决办法是升级到 Git 2.27+,它有 a contribution of mine to fix this.

PowerShell 对 git bisect log 输出的处理将 git bisect log 的最初仅 LF 输出转换为 CRLF。您可以看到错误的 CR 出现的位置:它是 '?'在错误消息中。

如果您无法升级 Git 的副本,有多种方法可以避免这种情况:

  • 将文件从 CRLF 转换回 LF。
    • 如果您使用的是 PowerShell 5+,((Get-Content C:\temp\bisect.log ) -join "`n") + "`n" | Set-Content -NoNewline \temp\bisect-lf.log
  • 让你的文本编辑器在编辑过程中使用 LF 保存文件。
  • 使用 CMD 而不是 PowerShell。然后,git bisect log > c:\temp\bisect.log 不会更改换行符。

mklement0's answer 致敬 PowerShell 转换单行程序。请参阅它以了解具体细节。

有一个 proposal 可以向 Set-Content 添加一个 -Delimiter 参数。如果实现了,这样的转换会更简单。

Christopher Warrington 的 (chwarr, the OP) patch has been merged in Git 2.27 (Q2 2020): "git bisect replay" 在使用 CRLF 行结尾时遇到输入文件问题,该问题已得到纠正。

commit 6c722cb (07 May 2020) by Christopher Warrington (chwarr)
(由 Junio C Hamano -- gitster -- in commit f9dbe28 合并,2020 年 5 月 14 日)

bisect: allow CRLF line endings in "git bisect replay" input

Signed-off-by: Christopher Warrington

We advertise that the bisect log can be corrected in your editor before being fed to "git bisect replay", but some editors may turn the line endings to CRLF.

Update the parser of the input lines so that the CR at the end of the line gets ignored.

Were anyone to intentionally be using terms/revs with embedded CRs, replaying such bisects will no longer work with this change. I suspect that this is incredibly rare.