&引用;git apply";给出错误“;与索引“不匹配”;当上一个应用跳过大块时

&引用;git apply";给出错误“;与索引“不匹配”;当上一个应用跳过大块时,git,git-apply,Git,Git Apply,git版本2.19.0 我从一个分支到另一个分支有两个提交文件“myfile”。在上次应用补丁时,我得到“错误:mydir/myfile:不匹配索引” 1) 我生成两个修补程序文件commit1.patch(最旧)和commit2.patch(最新): …正如预期的那样失败,因为补丁中的两个大块头修改了在比commit#1更早的commit中添加的代码块。我不应用那个旧的提交,因为它是我不希望在目标分支中使用的修复 3) 我使用--reject而不是-3重新应用补丁1,以跳过应用两个不适用的大块

git版本2.19.0

我从一个分支到另一个分支有两个提交文件“myfile”。在上次应用补丁时,我得到“错误:mydir/myfile:不匹配索引”

1) 我生成两个修补程序文件commit1.patch(最旧)和commit2.patch(最新):

…正如预期的那样失败,因为补丁中的两个大块头修改了在比commit#1更早的commit中添加的代码块。我不应用那个旧的提交,因为它是我不希望在目标分支中使用的修复

3) 我使用--reject而不是-3重新应用补丁1,以跳过应用两个不适用的大块:

git apply --reject 1.patch
。。。它不记录错误,并按预期记录跳过的两个补丁块,并应用补丁的其余部分

4) 我应用补丁#2:

为什么错误“与索引不匹配”“git status”显示暂存为空,“git fsck”不报告错误,“git diff--cached”不报告任何内容

我找到了一个解决方法:重新克隆目标分支,编辑掉无法从commit1.patch应用的两个大块,然后执行以下操作:

git apply -3 commit1.patch
git apply -3 commit2.patch
…工作正常,没有错误


如何解决commit2.patch输出中的“不匹配索引”错误,而不是首先手动从commit1.patch中删除两个大块?

您的问题的答案在中,但在几个部分中,我添加了黑体字(选项已经是黑体字):

-3,--3路
当修补程序无法干净地应用时,如果需要,请使用三向合并 补丁记录了它应该应用于的blob的身份, 我们可以在当地找到这些斑点,可能离开 工作树中文件中的冲突标记,供用户使用 决心此选项意味着
--索引
选项
,并且 与
--reject
--cached
选项不兼容

从这里开始,您必须后退一点:

--索引
--检查
生效时,或当应用修补程序时(即
默认情况下,禁用该选项的选项均无效),
确保修补程序适用于当前索引文件的内容
记录如果要在工作树中修补的文件未达到
日期,它被标记为错误。此标记也会导致索引
要更新的文件

因此,通过使用
-3
打开了
--index
,如果文件的工作树副本与文件的索引副本不匹配,则
--index
会显式调用错误

在前面的步骤3中,您手动运行了
git apply--reject
,而没有
-3
--index
。这在创建
.rej
文件时不会失败,但会使索引和工作树副本不同


如果使用
-3
没有任何意义,只需在这两种情况下都不使用它,这样您就可以在不更新文件索引副本的情况下进行应用,也不必约束文件的工作树副本以匹配文件的索引副本。

谢谢!根据您的建议,我开始清理并运行“git apply--reject commit1.patch”,然后运行“git apply commit2.patch”。完成时没有错误,并按预期跳过了修补程序1中的两个大块头。
git apply --reject 1.patch
git apply -3 commit2.patch
error: mydir/myfile: does not match index
git apply -3 commit1.patch
git apply -3 commit2.patch