如果 git-am 失败并显示“索引中不存在”该怎么办



我有一个补丁,当我尝试使用 git am 应用它时会给出以下输出

Checking patch old/filename...
error: old/filename: does not exist in index

在补丁中,旧的/文件名实际上被移动到新的/文件名,但似乎原始文件已经从源代码树中丢失了。

那么错误是什么以及如何解决/解决它?可以忽略它(使用 --reject 左右)吗?

修补程序不是针对正确的源树创建的。

发生这种情况的一种方式:

假设您的原始分支(您要应用补丁的分支)具有提交:

  1. 1A -> 1B -> 1C -> 1D

然后克隆此分支,并进行新的提交:

  1. 1A -> 1B -> 1C -> 1D -> 1E

提交 1e 包含旧/文件名

现在,您基于第二个分支而不是原始分支在修补程序中执行工作:

  1. 1A -> 1B -> 1C -> 1D -> 1E -> 1F

提交 1f 包括重命名旧/文件名 -> 新/文件名

现在,如果您为提交 1f 创建补丁,您将无法在提交 1d 之上应用它,因为将旧/文件名添加到索引/存储库的地方缺少提交 1e。

您可以使用--reject让它完成其最佳并以.rej文件中输出其余部分。然后你可以修复它手动并提交。

提示提取自:Raymes Khoury。

'git am' 并没有给出非常明确的故障位置。 我做了以下工作:使用"patch -p n patch_file"进行尝试。 这个 unix"patch"命令清楚地显示了拒绝发生的位置。 如果补丁命令有效,则补丁文件正常。

我看到"patch -p n"命令有效,但"git am -p n"仍然失败,出现模糊且令人困惑的错误消息"索引中不存在"。 我怀疑它只是找不到正确的文件。 所以我将 n 调整为 n-1。 然后它奏效了。

因此,实际原因是 -p arg 应该用 n-1 馈送,其中 n 是"patch"命令的正确值。

简而言之,工作命令是"git am -p n-1 patch_file"。

有一个类似的问题,将补丁从一个存储库应用到另一个存储库,中间有不同的提交,如 Jacques 所述: https://stackoverflow.com/a/27998109/9478470

备注,我尝试应用补丁的文件未移动(相同的相对路径)。有帮助的是"使用三向合并",如此处建议: https://stackoverflow.com/a/16968982/9478470

git am -3 < changes.patch

通过 Matt 对类似问题的评论找到了它:如何为特定提交生成 Git 补丁?

相关内容

最新更新