git - 当先前的应用跳过大块时,“git apply”会给出错误“不匹配索引”
问题描述
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' 显示暂存为空,'git fsck' 没有报告错误,'git diff --cached' 没有报告任何内容。
我找到了一个解决方法:新鲜克隆目标分支,编辑掉无法从commit1.patch应用的两个大块,然后执行:
git apply -3 commit1.patch
git apply -3 commit2.patch
......没有错误
除了首先手动从 commit1.patch 中删除两个大块之外,如何解决“不匹配索引”错误 commit2.patch 输出?
解决方案
您的问题的答案在文档git apply
中,但在几个部分中,我添加了粗体字(选项已经加粗了):
-3,--3way
当补丁不能干净地应用时,如果补丁记录了它应该应用到的 blob 的标识,并且我们在本地有这些 blob 可用,则可能会留下冲突标记工作树中的文件供用户解析。此选项隐含--index
选项--reject
,并且与和选项不兼容--cached
。
从这里你必须备份一点:
--index
何时--check
生效,或应用补丁时(这是禁用它的选项均无效时的默认值),确保该补丁适用于当前索引文件记录的内容。如果工作树中要修补的文件不是最新的,则将其标记为错误。此标志还会导致索引文件被更新。
因此,通过使用-3
您打开--index
,--index
如果文件的工作树副本与文件的索引副本不匹配,则显式调用错误。
之前,在第 3 步中,您手动运行了git apply --reject
,没有 -3
或--index
。创建文件时这不会失败,但会使索引和工作树副本不同。.rej
如果使用没有意义-3
,只需在两种情况下都将其省略,这样您就可以在不更新文件的索引副本的情况下应用,也不会限制文件的工作树副本以匹配文件的索引副本.
推荐阅读
- r - 有没有办法用 fread 指定日期的格式?
- mysql - 在 SQL 中计算俱乐部成员资格
- html - 将来自 github 的原始 html 嵌入另一个网站
- godot - 我如何将其他类型的动作(状态效果、治疗、属性提升、派对切换)添加到基于回合的系统中
- swift - 在 SwiftUI 中点击 TextField 时出现键盘错误
- woocommerce - 如何翻译显示在前端的管理字符串输入 - Woocommerce Multiple Shipping 插件
- java - 如何修复 JPopupMenu 隐藏在边框的插图内?
- ms-media-foundation - IMFStreamSink::ProcessSample 未调用——自定义媒体接收器
- .htaccess - 如何使用 htaccess 从 URL 转发中排除单个文件类型
- reactjs - 无法在我的反应钩子组件中将表单键值附加到“formData”