如果 git-am 失败并显示“不匹配索引”怎么办?

问题描述 投票:0回答:2

我正在尝试使用其他人使用

git-format-patch
创建的 git 补丁。该补丁是针对 HEAD 后面的一次提交而制作的,但据我了解,这应该不重要。当我运行
git am 0001.patch
时,我收到错误:

error: source.c: does not match index

我不太熟悉 git patch 的格式,但看起来索引不匹配,但源确实匹配。

解决这个问题的最佳方法是什么?手动更改索引以匹配?或者我应该

git-apply
然后在提交时复制作者和描述信息?

git patch
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
设置


OP在评论中提到:

在尝试运行

git am
之前,我确实运行过
git stash
,所以我认为这不是问题所在。
我最终做的是运行
git am -3 patch.patch
,然后手动修复问题,然后运行 '
git am --resolved
'。

注意:在最近的Git1.7.2 Release Notes中:

当冲突解决最终使补丁成为无操作时,来自“

git am -3
”的消息已得到改进。


8
投票

对我来说,由于我使用的是旧版本的

git
(centOS-6 发行版),我可以通过以下方式解决问题:

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

要了解更多关于其工作原理的信息,请查看此处的原始来源

我有点惊讶我们没有完成“预先刷新一次” 过去 5 年里没有人遇到过这种情况。看来 我从 git-applymbox 继承了这种行为;-)

在开始和重新启动时刷新一次是明智的 与“am --resolved”。

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