我有一个补丁,当我尝试使用 git am 应用它时会给出以下输出
Checking patch old/filename...
error: old/filename: does not exist in index
在补丁中 old/filename 实际上被移动到 new/filename 但似乎原始文件已经从源代码树中丢失了。
那么错误是什么以及如何解决/解决它?可以忽略它(使用 --reject 左右)吗?
未针对正确的源代码树创建补丁。
这可能发生的一种方式:
假设你的原始分支(你想要应用补丁的那个)有提交:
然后克隆此分支,并进行新的提交:
提交 1e 包括旧/文件名
现在你在补丁中进行工作,基于第二个分支,而不是原来的分支:
提交 1f 包括重命名 old/filename -> new/filename
现在,如果您为提交 1f 创建一个补丁,您将无法在提交 1d 之上应用它,因为在旧/文件名添加到索引/存储库的位置缺少提交 1e。
您可以使用--reject
它来使其发挥最大作用并将其余部分输出到.rej
文件中。然后你可以手动修复它并提交。
提示摘自:Raymes Khoury。
“git am”没有给出非常明确的失败位置。我做了以下操作:使用“patch -pn patch_file”来尝试。这个unix“patch”命令清楚地显示了拒绝发生的位置。如果patch命令有效,那么补丁文件很好。
我看到“patch -p n”命令有效,但“git am -p n”仍然失败,并出现模糊且令人困惑的错误消息“索引中不存在”。我怀疑它只是找不到正确的文件。所以我将 n 调整为 n-1。然后它起作用了。
因此,实际原因是 -p arg 应该输入 n-1,其中 n 是“patch”命令的正确值。
简而言之,工作命令是“git am -p n-1 patch_file”。