git apply神秘地失败了,我如何进行故障排除/修复?
我目前正在尝试对(github)存储库的PRs进行代码样式检查,我希望向提交者提供补丁,让他们可以轻松地修复代码样式。为此,我将调低他们的PR,在其上运行我们的uncrustify脚本以修复任何样式错误,并希望创建一个他们可以轻松应用的.patch文件。但是,它在某些文件上始终会中断 我知道(git版本1.7.10.4,带有git apply神秘地失败了,我如何进行故障排除/修复?,git,patch,Git,Patch,我目前正在尝试对(github)存储库的PRs进行代码样式检查,我希望向提交者提供补丁,让他们可以轻松地修复代码样式。为此,我将调低他们的PR,在其上运行我们的uncrustify脚本以修复任何样式错误,并希望创建一个他们可以轻松应用的.patch文件。但是,它在某些文件上始终会中断 我知道(git版本1.7.10.4,带有core.autocrlf=input,core.filemode=false): $git签出公共关系分支 $git日志-1(显示:commit dbb8d3f) $git
core.autocrlf=input
,core.filemode=false
):
$git签出公共关系分支
$git日志-1(显示:commit dbb8d3f)
$git状态(无需提交,工作目录清理)
$
$git diff>。/style.patch(因此补丁文件位于repo之外)
$git reset——硬头(模拟提交方端的情况)
$git日志-1(显示:commit dbb8d3f)
$git状态(无需提交,工作目录干净,所以我们就从这里开始)
$git apply../style.patch
错误:修补程序失败:somefile.cpp:195
错误:somefile.cpp:修补程序不适用(使用--check选项的输出相同)
这只适用于某些文件,而不是所有文件。我不知道如何解决这个问题,也就是说,如何让git告诉我到底哪里出了问题——当我挖掘时,它只告诉我一个大块头,但这仍然是相当大的问题
到目前为止我所做的尝试(没有成功):
apply--reverse
,apply--whitespace=nowarn
diff头
而不是单独的diff
格式补丁
,删除虚拟提交,使用git am
应用补丁,使用或不使用-3
,或使用git apply
patch
命令进行修补经过几个小时的努力,我的知识已经不多了……更新: 您可以使用
git apply-v
查看有关正在进行的操作的更多详细信息,git apply--check
验证操作,或者使用git apply--index
重建本地索引文件
根据您的评论,您的本地索引似乎已损坏,因此index
解决了此问题
我将留下我最初的答案和评论,主要是为了给人们提供关于发生了什么的背景,因为我怀疑其他人会跳到与我根据问题描述得出的相同的初始结论
----
最有可能的是,diff没有问题。相反,请查看目标git存储库。当您执行git reset--hard HEAD
时,没有任何东西可以保证另一个存储库上的HEAD
与您的存储库上的HEAD
相同
在目标回购上执行git日志,并查看顶部的提交。它和你制作差异的那个一样吗?很可能不是。查看历史记录并检查是否存在您需要的提交。如果是,那么目标回购就在你之前,你必须回去,对目标回购做git-pull
(或git-rebase
)并产生新的差异。如果不是,那么目标回购就在你之后,你需要对目标回购做git-pull
(或git-rebase
)以加快速度
请记住,如果您有其他人向您的“主”repo(bot-yours和目标存储库正在从中提取)提交请求,您可能必须
git-pull
这两个存储库,以使它们进行合理的最近常见提交。尝试检查您的补丁文件-例如:
git apply --reject mypatch.patch
这将向您展示差异(如果有的话)-下面是一个示例,说明它的外观:
error: patch failed: <filename>:<linenumber>
error: while searching for :
cout << "}" << endl; // example of a line in your patch
错误:修补程序失败::
错误:在搜索时:
cout在这种情况下,如果您已经尝试了下面列出的所有选项:
调查文件中潜在的不可打印/不可见字符
使用dos2unix
进行转换
更改git配置以调整处理行结尾的方式,例如:
在这种情况下,邪恶的另一个根源可能是你的IDE
例如,一些JetBrains IDE(如PHPStorm)具有以下选项:
今天花了4个多小时处理一个奇怪的补丁问题,结果出现以下错误:
git apply < my.git.patch --verbose
...
error: patch failed: plugins/some/file.php:74
git-apply
我意识到我是编辑的受害者(我不确定这是否是默认行为)
我正在使用PHPStorm检查补丁文件,它正在悄悄地从补丁文件中删除一个空白,该空白实际上存在于需要修补的目标文件中
这真是太狡猾了,我最终将Save for
选项中的删除尾随空格设置为None
,这样就再也不会碰到这样的问题了
还请记住,与平台相关的差异,如底层文件系统(MacOS/Linux for eg)的区分大小写,也可能是可疑的。在我上面描述的过程中,当前头部对于diff创建和diff应用程序都是相同的。这是该分支中的最后一次提交。我做重置完全是为了消除来自不同头脑的任何问题。所以这不可能。已自动处理必要时的更新,但
git config --global core.autocrlf input
git apply < my.git.patch --verbose
...
error: patch failed: plugins/some/file.php:74