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

Pau*_*gar 16 command-line diff

这是我的补丁命令的输出:

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.
Run Code Online (Sandbox Code Playgroud)

命令是

patch -d ~/SOME_DIR -p1 --merge --verbose -u
Run Code Online (Sandbox Code Playgroud)

该补丁是使用 git 生成的:

git --git-dir ~/SOME_DIR/.git diff -U8 bb1ee538982957b421a4c0e78f30428e73c9a072 HEAD -- malloc.c
Run Code Online (Sandbox Code Playgroud)

是什么patch unexpectedly ends in middle of line意思,有什么问题吗?它指的是大块 16 还是 17?我可以在补丁文件中寻找什么来找出导致这种情况的原因?

max*_*zig 11

该消息指的是 Hunk 16。

这个GitHub 讨论可能与您的问题有关。

它是关于贴片意外中间线的端部时产生的GIT中的diff与补丁使用,因为CRLF(回车,换行)问题的消息。

引用结论:

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

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

  • 应该指出的是,提问者问它这很糟糕 - 在一行中间结束不是问题 - 只是一个警告。 (2认同)

Ave*_*han 5

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


小智 5

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

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