Hunk#1在1处失败。这是什么意思?

时间:2013-01-11 16:37:59

标签: makefile cross-compiling vlc

运行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)。

7 个答案:

答案 0 :(得分:57)

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

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

  • 获取已包含补丁(最佳选项)的libdvdnav的更新版本。
  • 获取正在修补的.patch版本的libdvdnav个文件。
  • 手动修补。对于修补程序中的每个块,尝试在libdvdnav中找到相应的文件和行,并根据修补程序中的说明进行更正。
  • libdvdnav的版本更接近.patch文件的目标版本(可能是一个坏主意)。

答案 1 :(得分:4)

调试提示

  1. 将crlf添加到补丁文件的末尾并测试它是否有效
  2. 尝试使用--ignore-whitespace命令,如: markus@ubuntu:~$ patch -Np1 --ignore-whitespace -d software-1.0 < fix-bug.patchtutorial by markus

答案 2 :(得分:1)

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

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

-ignore-whitespace::它忽略空白差异(缩进等)。

-fuzz 3::“-fuzz X ”选项将最大模糊因子设置为行。此选项仅适用于上下文和统一差异。在寻找放置大块的地方时,它最多忽略 X 行。请注意,较大的模糊因子会增加制作错误补丁的几率。默认的模糊因子为2;默认值为1。没有必要将其设置为超过差异中的上下文行数,通常为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

答案 3 :(得分:0)

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

您必须按如下所示运行命令; patch -p0 --dry-run <路径/到/您的/patchFile/yourPatch.patch

答案 4 :(得分:0)

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

这可能适用于您,如果您在非Windows环境中对涵盖两个版本(均来自Windows环境)之间的更改的补丁程序进行了更改。您要小心如何编辑此类文件。

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

答案 5 :(得分:-1)

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

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

答案 6 :(得分:-1)

Hunk #1 在 1 处失败。 1 / 1 大块失败 - 将拒绝保存到文件 Makefile.am.rej

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

然后我搜索了小零件 就像补丁错误背后的原因然后我发现

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

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

步骤 2

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

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

现在如果这个文件是在 *NIX 系统中制作的,它将显示

$ cat -A 文件 你好$

你好$ 但是如果这个文件是在 Windows 中制作的,它会显示

$ cat -A 文件 你好^M$

你好^M

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

这是我从 stackoverflow 中发现的

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

然后我在将补丁应用到 windows 或 unix 格式之前转换这些文件

dos2unix filename.extension 或 unix2dos filename.extension

这个转换文件

然后应用补丁得到结果

命令提示符命令

正在创建文件 触摸文件名.txt

用于创建补丁/差异文件

diff -u originalfile.txteditedfile.txt > originalfile.diff 要么 diff -u originalfile.txteditedfile.txt > originalfile.patch

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

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

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

应用更改 patch originalfile.txt < originalfile.diff

完成!!

我希望这对你有帮助!