git-apply神秘失败,我该如何解决/修复?

时间:2013-02-01 15:29:13

标签: git patch

我目前正在尝试对(github)存储库的PR进行代码样式检查,并且我希望向提交者提供补丁,以便他们可以轻松地修复代码样式。为此,我正在拉下他们的PR,在它上面运行我们的解密脚本以修复任何样式错误,并且想要创建一个可以轻松应用的.patch文件。但是,它一直在打破一些文件。

我这样做(git版本1.7.10.4与core.autocrlf=inputcore.filemode=false):

$ git checkout pr-branch
$ git log -1 (shows: commit dbb8d3f)
$ git status (nothing to commit, working directory clean)
$ <run the code styler script, which modifies some files>
$ git diff > ../style.patch (so the patch file lands outside the repo)
$ git reset --hard HEAD (to simulate the situation at the submitter's end)
$ git log -1 (shows: commit dbb8d3f)
$ git status (nothing to commit, working directory clean, so we are where we started)
$ git apply ../style.patch
error: patch failed: somefile.cpp:195
error: somefile.cpp: patch does not apply (same output using the --check option)

这仅适用于某些文件,而不是所有文件。我不知道如何解决这个问题,即如何让git告诉我它到底出错的地方 - 当我挖掘时它只会告诉我一个大块的#,但这仍然非常庞大。

到目前为止我尝试过的(没有成功):

  1. apply --reverseapply --whitespace=nowarn
  2. diff HEAD而不是diff单独
  3. 进行虚拟提交(提交工作没有问题!),使用format-patch,删除虚拟提交,使用带有git-am或不带-3的{​​{1}}应用补丁,或者应用{{1 }}
  4. 将修补程序文件放在本地目录而不是一个(在这里抓住吸管)
  5. 检查git-diff,-apply,-format-patch,-am的手册页以获取有用的内容
  6. 使用linux git-apply命令修补
  7. ....
  8. 我不知道差异有什么不对。空白的东西应该只发出警告,对吗?在任何情况下,我都不想忽略它们,因为它是一种明显涉及空格的样式修复。

    我如何修复/诊断这个问题,甚至找出它确切的位置?如果我发布其中一个罪魁祸首文件的差异会有帮助吗?令我感到困惑的是,committ工作没有问题,但是从提交创建的补丁不是??

    经过几个小时的摔跤之后,我知道了......

3 个答案:

答案 0 :(得分:31)

更新:

您可以使用git apply -v查看有关正在进行的操作的详细信息,git apply --check只是验证操作,或git apply --index重建本地索引文件。

根据您的评论,您的本地索引似乎已损坏,因此index解决了该问题。

我会留下我的原始答案和评论主要是为了让人们了解正在发生的事情,因为我怀疑其他人会根据问题描述得出相同的初步结论。

<强> ------

差异很可能没什么问题。而是查看目标git存储库。当您执行git reset --hard HEAD时,没有什么可以保证您其他存储库中的HEAD与您的HEAD相同。

在目标仓库上执行git log并查看顶部的提交。它与你制作差异的那个一样吗?最有可能的不是。查看历史记录并检查是否存在您需要的提交。如果是,则目标回购优先于您的回报,您必须返回,执行git pull(或git rebase)并生成新的差异。如果不是,则目标回购在您的后面,您需要在目标回购上执行git pull(或git rebase)以使其加速。

请记住,如果您有其他人承诺使用您的“主”仓库(您的机器人和目标存储库从中撤出),您可能必须git pull这两个存储库,才能使它们到达一个合理的最近的共同提交。

答案 1 :(得分:7)

尝试检查补丁文件 - 例如:

Context

这将显示差异(如果有的话) - 以下是它的外观示例:

git apply --reject mypatch.patch

答案 2 :(得分:0)

在这种情况下,如果您已经尝试过下面列出的所有选项:

  1. 调查文件中潜在的不可打印/不可见字符
  2. 使用dos2unix进行转化
  3. 更改git配置以调整处理行尾的方式,例如:
git config --global core.autocrlf input

在这种情况下,另一个邪恶的根源可能是您的IDE。

例如,某些JetBrains IDE(如PHPStorm)具有以下选项:

enter image description here

今天在花了4个多小时的血腥之后,解决了一个奇怪的补丁问题,最终出现以下错误:

git apply < my.git.patch --verbose
...
error: patch failed: plugins/some/file.php:74

我意识到自己是编辑器的受害者(我不确定这是否是默认行为)。

我正在使用PHPStorm检查补丁文件,并且它正在默默地从补丁文件中删除单个空白,该空白确实存在于需要修补的目标文件上。

这是一个超级偷偷摸摸的经历,我最终将Strip trailing spaces on Save for选项设置为None,以免再次遇到此类问题。

还请记住,也可能会怀疑与平台相关的差异,例如基础文件系统(例如MacOS / Linux)是否区分大小写。