如果git-am失败并出现“不匹配索引”的错误,应该怎么办?

23

我想使用git-format-patch应用别人创建的git补丁。该补丁是针对HEAD之前的一个提交所创建的,但据我所知这不应该有影响。当我运行git am 0001.patch时,出现以下错误:

error: source.c: does not match index

我对git补丁的格式不太熟悉,但似乎索引不匹配,但源代码确实匹配。

如何最好地解决这个问题?手动更改索引以匹配吗?还是应该使用git-apply,然后在提交时复制作者和说明信息?

2个回答

26

来自J.C. Hamano(Git维护者)本人,这是关于:

在脏的工作树中应用补丁和合并到干净的索引中。

  • 脏的工作树指的是您尚未添加到索引中的更改。
    一个非脏的工作树是一个干净的工作树。
  • 脏的索引是指您已经将更改添加到其中(换句话说,“git diff --cached”将报告一些更改)。
    干净的索引与HEAD匹配

使用最近的Git版本,您可以中止:

要恢复原始分支并停止打补丁,请运行“git am --abort”。

然后:

对于那些无法决定的人来说,最简单的方法可能是将更改存储起来以备后用。

$ git stash save "Random changes that are not ready"

然后重新执行"git pull"或"git am"。
"git stash"是那些害怕承诺的人的终极工具。

重新执行"git pull"或"git am"后,您可以重放您隐藏的本地更改:
$ git stash pop

注意:脏树的一个来源可能是autocrlf设置(例如在这个msysgit问题81中),因此确保将其设置为false。另一个不一致的来源是core.whitespace设置

评论中提到:

在尝试运行git am之前,我确实运行了git stash,所以我不认为那是问题所在。
我最终做的是运行git am -3 patch.patch,然后手动解决问题,然后运行'git am --resolved'。

注意:在最近的Git1.7.2版本发布说明中:

当冲突解决导致补丁无法执行时,“git am -3”的消息已得到改进。


感谢您的回复。在尝试运行git am之前,我确实运行了git stash,所以我不认为那是问题所在。我最终做的是运行git am -3 patch.patch,然后手动修复问题,最后运行'git am --resolved`。 - joshdoe
@joshdoe:感谢您的反馈。我已经把它包含在答案中了。 - VonC

6

我使用的是旧版本的git(centOS-6发行版)。

我通过以下步骤解决了这个问题:

  • git update-index --refresh
  • git am ${patch_filename}

想要了解更多原因,请查看此处的原始来源

"

我很惊讶过去5年中没有人遇到过这个问题,我们似乎还没有进行“提前刷新”操作。看来我从git-applymbox那里继承了这种行为;-)

在开始时和重新启动时使用“am --resolved”合理地进行一次刷新。

"


我尝试了被点赞的答案,但对我没有用。而是使用了“git update-index --refresh”命令,结果起了作用。 - mask

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接