22

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

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

在补丁中 old/filename 实际上被移动到 new/filename 但似乎原始文件已经从源代码树中丢失了。

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

4

3 回答 3

8

未针对正确的源代码树创建补丁。

这可能发生的一种方式:

假设你的原始分支(你想要应用补丁的那个)有提交:

  1. 1a -> 1b -> 1c -> 1d

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

  1. 1a -> 1b -> 1c -> 1d -> 1e

提交 1e 包括旧/文件名

现在你在补丁中进行工作,基于第二个分支,而不是原来的分支:

  1. 1a -> 1b -> 1c -> 1d -> 1e -> 1f

提交 1f 包括重命名 old/filename -> new/filename

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

于 2015-01-17T09:32:29.553 回答
2

您可以使用--reject它来使其发挥最大作用并将其余部分输出到.rej文件中。然后你可以手动修复它并提交。

提示摘自:Raymes Khoury

于 2018-05-24T21:49:34.537 回答
0

“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”。

于 2021-07-28T23:26:13.590 回答