我目前正在尝试对一个(github)存储库的PRs进行代码样式的检查,并且我希望将补丁交付给提交者,他们可以轻松地修复代码。为此,我正在删除他们的PR,在上面运行我们的uncrustify脚本来修复任何样式错误,并希望创建一个可以轻松应用的.patch文件。但是,它总是会破坏一些文件。
我知道(使用core.autocrlf=input
,core.filemode=false
的git版本1.7.10.4 ):
$ 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告诉我它到底出了什么问题--它只在我挖掘的时候告诉我一个hunk#,但这仍然是相当大的。
到目前为止,我尝试过的(没有成功):
apply --reverse
,apply --whitespace=nowarn
diff HEAD
而不是diff
format-patch
,删除虚拟提交,使用带或不带-3
的git-am
应用修补程序,或使用git-apply
应用修补程序patch
命令的修补程序我不知道这种差别会有什么问题。白色空间的东西只应该警告你,对吧?无论如何,我都不想忽视它们,因为这是一个很明显涉及空白的样式修复。
我如何修复/诊断这个问题,甚至找出它的确切位置?如果我贴出其中一个罪犯文件的差异会有帮助吗?还有什么让我感到困惑的是,提交没有问题,但是根据提交创建的补丁没有问题?
在与这个搏斗了几个小时后,我的知识已接近尾声.
发布于 2013-02-01 15:48:14
更新:
您可以使用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
),以使其达到速度。
请记住,如果您有其他人承诺您的“主”回购( bot您的和目标存储库正在退出),您可能必须git pull
这两个存储库,以使他们达到一个合理的最近的普通提交。
发布于 2016-11-18 12:09:11
尝试对照修补程序文件进行检查-示例:
git apply --reject mypatch.patch
这将向您展示差异(如果有的话)--下面是一个示例,说明它的样子:
error: patch failed: <filename>:<linenumber>
error: while searching for :
cout << "}" << endl; // example of a line in your patch
发布于 2020-06-17 16:17:12
在这种情况下,如果您已经尝试了下面列出的所有选项:
dos2unix
进行转换git config --global core.autocrlf input
在这种情况下,另一个邪恶的根源可能是您的IDE。
例如,一些JetBrains IDE(如PHPStorm )有以下选项:
今天在一个奇怪的修补问题上花费了超过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 )的区分大小写,也可能是可疑的。
https://stackoverflow.com/questions/14649605
复制相似问题