当我尝试使用git am
时,我有一个补丁,它会给出以下输出Checking patch old/filename...
error: old/filename: does not exist in index
在补丁中,old / filename实际上被移动到new / filename但似乎源树中已经缺少原始文件。
那么错误是什么以及如何解决/解决它?它可以被忽略(使用--reject等)吗?
答案 0 :(得分:7)
未针对正确的源树创建补丁。
这可能发生的一种方式:
假设您的原始分支(要应用补丁的分支)具有提交:
然后克隆此分支,并进行新的提交:
提交1e包含旧/文件名
现在你在补丁中完成工作,基于第二个分支,而不是原始分支:
提交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”。