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

时间:2013-10-01 12:09:07

标签: git git-am

当我尝试使用git am

时,我有一个补丁,它会给出以下输出
Checking patch old/filename...
error: old/filename: does not exist in index

在补丁中,old / filename实际上被移动到new / filename但似乎源树中已经缺少原始文件。

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

3 个答案:

答案 0 :(得分:7)

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

这可能发生的一种方式:

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

  1. 1a - > 1b - > 1c - > 1D
  2. 然后克隆此分支,并进行新的提交:

    1. 1a - > 1b - > 1c - > 1d - > 1E
    2. 提交1e包含旧/文件名

      现在你在补丁中完成工作,基于第二个分支,而不是原始分支:

      1. 1a - > 1b - > 1c - > 1d - > 1e - > 1F
      2. 提交1f包括重命名old / filename - >新/文件名

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

答案 1 :(得分:3)

您可以使用--reject来执行此操作 最好并输出.rej个文件中的其余部分。然后你可以解决它 手动和提交。

提示摘自:Raymes Khoury

答案 2 :(得分:0)

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