当前一个申请跳过帅哥时,“git apply”会给出错误“与索引不匹配”

问题描述 投票:1回答:1

git版本2.19.0

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

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

cd /target-branch  
git --git-dir=/source-branch/myrepo/.git format-patch -k -1 <commit N's ID>  

2)我应用补丁#1:

git apply -3 commit1.patch  
error: patch failed: mydir/myfile:17  
error: repository lacks the necessary blob to fall back on 3-way merge.
error: mydir/myfile: patch does not apply  

...因为预期失败,因为补丁中的两个人修改了在提交#1之前的提交中添加的代码块。我没有应用那个旧的提交,因为它是我不希望在目标分支中的修复。

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

git apply --reject 1.patch

...记录没有错误并记录它按预期跳过的两个补丁程序,并应用补丁的其余部分。

4)我应用补丁#2:

git apply -3 commit2.patch
error: mydir/myfile: does not match index

为什么错误“与索引不匹配”? 'git status'显示staging为空,'git fsck'报告没有错误,'git diff --cached'报告没有。

我找到了一个解决方法:新鲜克隆目标分支,编辑出不能从commit1.patch应用的两个黑客,然后执行:

git apply -3 commit1.patch
git apply -3 commit2.patch

......没有任何错误

如何解决“不匹配索引”错误commit2.patch输出,除了先从commit1.patch手动删除两个帅哥?

git git-apply
1个回答
2
投票

您的问题的答案在the git apply documentation,但在几个部分,我添加了粗体(选项已经是粗体):

-3, - 3way 当补丁不能干净地应用时,如果补丁记录了应该应用的blob的身份,则回退到三向合并,并且我们在本地可以使用这些blob,可能会将冲突标记留在工作树中的文件中供用户解决。此选项意味着--index选项,并且与--reject--cached选项不兼容。

从这里你必须备份一下:

- 指数 当--check生效或应用补丁时(默认情况下,当禁用它的任何选项都没有生效时),请确保补丁适用于当前索引文件记录的内容。如果要在工作树中修补的文件不是最新的,则会将其标记为错误。此标志还会导致更新索引文件。

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

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

如果使用-3没有任何意义,只需在两种情况下都将其保留,以便在不更新文件的索引副本的情况下应用,并且不会限制文件的工作树副本以匹配文件的索引副本无论是。

© www.soinside.com 2019 - 2024. All rights reserved.