“补丁意外地在行中间结束”是什么意思?

“补丁意外地在行中间结束”是什么意思?

这是我的 patch 命令的输出:

Hunk #11 merged at 4184,4190.
Hunk #12 merged at 4444.
Hunk #13 merged at 4944.
Hunk #14 NOT MERGED at 5106-5116.
Hunk #15 merged at 5290.
Hunk #16 merged at 5448.
patch unexpectedly ends in middle of line
Hunk #17 merged at 5608,5611.

命令是

patch -d ~/SOME_DIR -p1 --merge --verbose -u

该补丁是使用 git 生成的:

git --git-dir ~/SOME_DIR/.git diff -U8 bb1ee538982957b421a4c0e78f30428e73c9a072 HEAD -- malloc.c

是什么patch unexpectedly ends in middle of line意思?这是一个问题吗?它指的是猛男16还是17?我可以在补丁文件中查找什么来找出导致此问题的原因?

答案1

该消息指的是 Hunk 16。

GitHub 讨论可能与你的问题有关。

这是关于补丁意外地在行中间结束当 git 生成的差异与补丁一起使用时,由于 CRLF(回车、换行)问题而产生的消息。

引用一下结论:

[..] git 对行结尾非常挑剔。你是不是在windows上?无论如何,您应该在 git 配置中设置 autocrlf。如果你在 Windows 上,你想要“true”,如果你在 mac 或 Linux 上,你应该使用“input”[..]

文章中处理行结尾GitHub 详细介绍了上述声明。

答案2

如果您不使用git(@maxslepzig 的评论是关于在 的上下文中使用 patch git),请尝试在文件末尾添加回车符。我这样做了并patch接受了我的补丁。

答案3

添加到这个非常古老的讨论:

导致OP指出的警告的问题通常是由行结尾问题引起的。

patch 想要尾随换行符 (LF) 以确定文件结尾(并警告可能被意外截断的统一差异)

  1. 附加正确的换行符而不打开文件进行编辑(这可能会修改行尾或根据编辑器的设置删除尾随行/空格),您可以执行以下简单操作:

    echo -e "\n" >> YOURPATCHFILE

    这会将换行符附加到文件末尾,而不进行任何其他更改。

  2. 如果您的补丁文件已经很奇怪或者您想一次进行多个可能的修复,您可以通过编码(到 ascii)纠正许多问题,包括行结尾(CR 或 CRLF 到 LF):

    dos2unix -k YOURPATCHFILE

    您可能需要从操作系统的包管理器安装 dos2unix 二进制文件; IE

    • 基于 Debian/Ubuntu:sudo apt install dos2unix
    • Fedora/RHEL/CentOS:sudo yum install dos2unix
    • MacOS(带brew):brew install dos2unix

相关内容