当运行make
时,我得到以下错误,我不知道这意味着什么或该怎么做。有谁能给我点化一下或者给我指路吗?
(cd libdvdnav-git && patch -p1) < ../../contrib/src/dvdnav/dvdnav.patch
patching file Makefile.am
Hunk #1 FAILED at 1.
1 out of 1 hunk FAILED -- saving rejects to file Makefile.am.rej
make: *** [dvdnav] Error 1
我试图交叉编译VLC的win32(使用linux)。
patch
产生的错误。如果你打开.patch
文件,你会看到它被组织在一堆段,所谓的"大块"。每个代码块标识新旧版本中相应的代码片段(通过行号),这些代码片段之间的差异,以及它们之间的相似之处("上下文")。
如果块的相似性与原始文件中的不匹配,则块可能会失败。当您看到此错误时,几乎总是因为您对正在修补的代码的错误版本使用了补丁。有几种方法可以解决这个问题:
- 获取已经包含补丁的
libdvdnav
的更新版本(最佳选项)。 - 获取
libdvdnav
版本的.patch
文件。 - 手动补丁。对于补丁中的每个chunk,尝试在
libdvdnav
中找到相应的文件和行,并根据补丁中的说明进行纠正。 - 取
libdvdnav
的版本,它更接近.patch
文件的版本(可能是个坏主意)。
在某些情况下,在文件版本中没有差异,只有缩进、空格、行结束或行号不同。
为了不顾这些差异进行补丁,可以使用以下两个参数:
——ignore-whitespace:它忽略空格的差异(缩进等)。
——fuzz 3: "——fuzz X"选项设置最大模糊因子为行。此选项仅适用于上下文和统一的差异;它会忽略X行来寻找安装块的位置。请注意,较大的模糊系数会增加制作错误补丁的几率。默认模糊系数为2;没有必要将其设置为超过diff中上下文的行数,通常为3行。
不要忘记使用"——dry-run":它会尝试不应用补丁。
示例:
patch --verbose --dry-run --ignore-whitespace --fuzz 3 < /path/to/patch.patch
关于Fuzz的更多信息:
https://www.gnu.org/software/diffutils/manual/html_node/Inexact.html
调试提示
- 将crlf添加到补丁文件的末尾并测试它是否有效
- 试试——ignore-whitespace命令,如下所示:
markus@ubuntu:~$ patch -Np1 --ignore-whitespace -d software-1.0 < fix-bug.patch
参见教程由markus
在我的情况下,补丁是由IDEA生成的,但是,我编辑了补丁并保存了它,将CRLF更改为LF,然后补丁停止工作。奇怪的是,将其转换回CRLF不起作用。我注意到在VI编辑器中,即使设置为DOS格式后,'^M'也没有添加到行尾。这迫使我只能在VI中进行更改,以便保留eol。
这可能适用于您,如果您在非Windows环境中对覆盖来自Windows环境的两个版本之间的更改的补丁进行更改。你在编辑这样的文件时要小心。
BTW ignore-whitespace
没有帮助。
当我使用git diff
生成补丁文件并粘贴输出时发生了这种情况:
git diff branch-1 branch-2 # and then copy the output
插入或改变空白的性质。
我将输出定向到一个文件:
git diff branch-1 branch-2 > my-patch.patch
修复了这个问题。
当我没有在相关git项目的顶级目录中应用补丁时,我收到了"hunks failed"消息。我正在子目录中应用补丁(我创建它的地方)。
似乎补丁可以从git项目的子目录中创建,但不应用。
你必须像下面这样运行命令;补丁-p0——干跑
请确保(在制作diff文件之前)要区分的2个文件在文件末尾没有额外的新行
光标停在文件中最后输入的单词后
大帅哥1号1分失败。1 out of 1 hunk FAILED—将拒绝保存到文件Makefile.am.rej
同样的错误,我发现当我通过补丁应用更改,然后在StackOverflow上完全搜索,但我没有得到答案。
然后我搜索小的部分像补丁错误背后的原因,然后我发现
Hunk #n FAILED at nnn. n out of n hunks FAILED - saving rejects to file file.rej
这意味着不能将一个或多个更改(称为hunks)引入文件。有时,这可能是因为补丁通过电子邮件发送或复制到文件中,并且添加或删除了空白。尝试在命令行中添加——ignore-whitespace来解决这个问题。
步骤2然后我搜索了文件的不同结尾,我发现有两种格式系统LF, CF
然后使用
检查文件的格式现在如果这个文件是在*NIX系统中创建的,它将显示
$ cat -A file
hello$
hello$
但是如果这个文件是在Windows中创建的,它会显示
$ cat -A file
hello^M$
hello^M
表示CR, $表示LF。注意,Windows没有用CRLF
保存最后一行这是我从StackOverflow
找到的然后我检查我的原始文件格式和。patch/diff,我得到补丁文件有LF和Cf
然后在将补丁应用到windows或unix格式之前使用
转换这些文件dos2unix文件名。
转换文件
然后应用补丁获得结果
命令提示命令
创建文件touch filename.txt
用于创建补丁/diff文件
diff -u originalfile.txt editedfile.txt > originalfile.diff
或
diff -u originalfile.txt editedfile.txt > originalfile.patch
在应用更改检查文件格式之前
cat -A originalfile.txt
cat -A originalfile.diff
现在转换doc2unix或unix2dos
unix2dos originalfile.txt
unix2dos originalfile.diff
patch originalfile.txt < originalfile.diff
完成! !
我希望这将有助于你!