67

运行时出现以下错误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

我正在尝试为 win32 交叉编译 VLC(使用 linux)。

4

8 回答 8

82

这是由 生成的错误patch。如果您打开.patch文件,您会看到它被组织成一堆片段,即所谓的“大块”。每个块都标识新旧版本中的相应代码段(按行号),这些代码段之间的差异以及它们之间的相似之处(“上下文”)。

如果大块的相似性与原始文件中的内容不匹配,大块可能会失败。当您看到此错误时,几乎总是因为您正在为您正在修补的代码的错误版本使用补丁。有几种方法可以解决这个问题:

  • 获取libdvdnav已包含补丁的更新版本(最佳选择)。
  • 获取您正在修补.patch的版本的文件。libdvdnav
  • 手动打补丁。对于补丁中的每一个hunk,尝试找到对应的文件和行libdvdnav,并根据补丁中的说明进行更正。
  • 取它的版本libdvdnav更接近.patch文件的任何版本(可能是个坏主意)。
于 2013-01-11T16:48:01.403 回答
21

在某些情况下,文件版本没有区别,而只是缩进、间距、行尾或行号。

尽管存在这些差异,但要修补,可以使用以下两个参数:

--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

于 2018-09-18T07:38:07.693 回答
4

调试技巧

  1. 将crlf添加到补丁文件的末尾并测试它是否有效
  2. 尝试使用 --ignore-whitespace 命令,如下所示: markus@ubuntu:~$ patch -Np1 --ignore-whitespace -d software-1.0 < fix-bug.patch 请参阅markus 的教程
于 2016-06-09T15:37:00.340 回答
0

当我没有在相关 git 项目的顶级目录中应用补丁时,我收到了“hunks failed”消息。我在子目录中应用补丁(我创建它的地方)。

似乎可以从 git 项目中的子目录创建补丁,但不能应用。

于 2014-02-11T01:57:30.037 回答
0

按照这里的说明,它解决了我的问题。

您必须运行如下命令;patch -p0 --dry-run < path/to/your/patchFile/yourPatch.patch

于 2019-04-05T11:50:36.623 回答
0

就我而言,IDEA 生成的补丁非常好,但是,我编辑了补丁并保存了它,将 CRLF 更改为 LF,然后补丁停止工作。奇怪的是,将其转换回 CRLF 不起作用。我在 VI 编辑器中注意到,即使设置为 DOS 格式,'^M' 也没有添加到行尾。这迫使我只在 VI 中进行更改,以便保留 EOL。

这可能适用于您,如果您在非 Windows 环境中对覆盖两个版本之间更改的补丁进行更改,这两个版本都来自 Windows 环境。您要小心编辑此类文件的方式。

顺便说一句ignore-whitespace,没有帮助。

于 2019-10-17T15:32:28.280 回答
0

当我生成补丁文件git diff并粘贴输出时,它发生在我身上:

git diff branch-1 branch-2 # and then copy the output

这会插入或更改空格的性质。

我将输出定向到一个文件:

git diff branch-1 branch-2 > my-patch.patch

这解决了这个问题。

于 2022-03-01T11:53:40.587 回答
-1

Hunk #1 FAILED at 1. 1 / 1 hunk FAILED -- 将拒绝保存到文件 Makefile.am.rej

当我通过补丁应用更改然后在stackoverflow上完全搜索时发现了同样的错误,但我没有得到答案。

然后我搜索了一些小部分,比如补丁错误背后的原因,然后我发现

Hunk #n 在 nnn 失败。n 个大块中的 n 个失败 - 将拒绝保存到文件 file.rej

这意味着不能将一个或多个称为大块的更改引入文件中。有时这可能是因为通过电子邮件发送补丁或将补丁复制到文件中,并且添加或删除了空格。尝试将 --ignore-whitespace 添加到命令行以解决此问题。

第2步

然后我搜索了不同的文件结尾,我发现有两种类型的格式系统 LF,CF

然后我检查我的文件我使用什么格式

现在如果这个文件是在 *NIX 系统中创建的,它会显示

$ cat -A 文件你好$

hello$ 但是如果这个文件是在 Windows 中创建的,它会显示

$ cat -A 文件你好^M$

你好^M

代表 CR,$ 代表 LF。请注意,Windows 没有使用 CRLF 保存最后一行

这是我从stackoverflow中找到的

然后我检查我的原始文件格式和 .patch/diff 我得到那个补丁文件有 LF 和 Cf

然后我在将补丁应用到 Windows 或 unix 格式之前转换这些文件,方法是使用

dos2unix 文件名.extension 或 unix2dos 文件名.extension

这将转换文件

然后应用补丁得到结果

命令提示符命令

创建文件 touch filename.txt

用于创建补丁/差异文件

diff -u originalfile.txt 编辑文件.txt > originalfile.diff 或 diff -u originalfile.txt 编辑文件.txt > originalfile.patch

在应用更改检查文件格式之前

cat -A originalfile.txt
cat -A originalfile.diff

现在转换 doc2unix 或 unix2dos unix2dos originalfile.txt unix2dos originalfile.diff

应用更改 补丁 originalfile.txt < originalfile.diff

完毕 !!

我希望这会帮助你!

于 2021-03-26T19:33:02.333 回答