大块头 #1 在 1 处失败。这是什么意思?



当运行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

调试提示

  1. 将crlf添加到补丁文件的末尾并测试它是否有效
  2. 试试——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

完成! !

我希望这将有助于你!

相关内容

  • 没有找到相关文章

最新更新