文件末尾没有换行符

时间:2011-04-28 03:35:14

标签: git git-svn

在执行git diff时,它会说“文件末尾没有换行符”

好的,文件末尾没有换行符。有什么大不了的?

这条消息有什么意义,它试图告诉我们什么?

13 个答案:

答案 0 :(得分:390)

它表示您在文件末尾没有换行符(通常为'\n',即CR或CRLF)。

也就是说,简单来说,文件中的最后一个字节(或者如果你在Windows上的字节)不是换行符。

显示消息是因为否则无法区分最后有换行符和不换行换行符的文件。 Diff必须输出换行符,否则结果将更难以自动读取或处理。

请注意,如果文件格式允许,则始终将换行符作为最后一个字符是一种很好的样式。此外,例如,对于C和C ++头文件,它是语言标准所必需的。

答案 1 :(得分:79)

它不仅仅是糟糕的风格,在文件上使用其他工具时会导致意外行为。

以下是PhantomJS 2.1.1 (Linux 0.0.0) LOG: '1. *****************************' LOG: '3. *****************************'

test.txt

最后一行没有换行符。让我们看一下文件中有多少行:

first line
second line

也许这就是你想要的,但在大多数情况下,你可能希望文件中有2行。

此外,如果您想要合并文件,它可能不会像您期望的那样:

$ wc -l test.txt
1 test.txt

最后,如果要添加新行,它会使你的差异稍微嘈杂。如果您添加了第三行,它将显示第二行的编辑以及新添加。

答案 2 :(得分:16)

它只表示文件末尾没有换行符。这不是一个灾难,它只是一个消息,使得在命令行中查看差异时没有人更清楚。

答案 3 :(得分:15)

唯一的原因是Unix历史上有一个以换行符结尾的所有人类可读文本文件的约定。当时,这在显示或连接文本文件时避免了额外的处理,并避免将文本文件与包含其他类型数据的文件(例如,人类不可读的原始二进制数据)区别对待。

由于这种惯例,那个时代的许多工具都期望结束换行符,包括文本编辑器,差异工具和其他文本处理工具。 Mac OS X构建于BSD Unix之上,Linux开发为与Unix兼容,因此两种操作系统都继承了相同的约定,行为和工具。

Windows尚未开发出与Unix兼容的版本,因此它没有相同的约定,并且大多数Windows软件都处理得很好,没有尾随换行符。

但是,由于Git是首先为Linux开发的,许多开源软件都是基于Unix兼容的系统构建的,如Linux,Mac OS X,FreeBSD等,大多数开源社区及其工具(包括编程)语言)继续遵循这些惯例。

技术原因在1971年是有道理的,但在这个时代,它主要是惯例并保持与现有工具的兼容性。

答案 4 :(得分:14)

如果你在现有文件的末尾添加了一个新行,该行在最后没有换行符,那么差异也会显示旧的最后一行也是修改过的,而在概念上它不是。

至少有一个很好的理由在最后添加换行符。

答案 5 :(得分:6)

在以前的回复中,我没有看到一件事。当文件的一部分被截断时,关于没有行尾的警告可能是警告。这可能是数据丢失的症状。

答案 6 :(得分:5)

之所以采用此约定,是因为在类似UNIX的操作系统上,换行符被视为行终止符和/或消息边界(这包括进程之间的管道,行缓冲等)。

例如,考虑将仅包含换行符的文件视为空行。相反,长度为零字节的文件实际上是具有零行的空文件。可以根据wc -l命令确认。

总的来说,此行为是合理的,因为如果\n字符只是一个行分隔符而不是一行,则没有其他方法可以区分空文本文件和具有单个空行的文本文件-终止符。因此,有效的文本文件应始终以换行符结尾。唯一的例外是如果文本文件打算为空(无行)。

答案 7 :(得分:4)

核心问题是您定义行以及是否在线结束 字符序列是否是行的一部分。基于UNIX的编辑器 (如VIM)或工具(如Git)使用EOL字符序列作为 行终止符,因此它是行的一部分。它类似于 在C和Pascal中使用分号(;)。在C分号终止 语句,在Pascal中它将它们分开。

答案 8 :(得分:3)

源文件通常由工具连接(C,C ++:头文件,Javascript:bundlers)。如果省略换行符,则可能会引入令人讨厌的错误(其中一个源的最后一行与下一个源文件的第一行连接)。希望所有的源代码concat工具在那里插入一个换行文件之间的换行符,但似乎并非总是如此。

问题的症结在于 - 在大多数语言中,换行符具有语义含义,而文件结尾不是换行符的语言定义替代品。所以你应该用换行符来终止每个语句/表达式 - 包括最后一个。

答案 9 :(得分:2)

这确实会导致问题,因为行结尾会自动修改弄脏文件而不对其进行任何更改。请参阅此帖以获得解决方案。

git replacing LF with CRLF

答案 10 :(得分:1)

您的原始文件可能没有换行符。

但是,Linux中的某些编辑器如 gedit 会默默地在文件末尾添加换行符。使用这种编辑器时,你无法摆脱这条消息。

我尝试克服此问题的方法是使用visual studio code editor

打开文件

此编辑器清楚地显示最后一行,您可以根据需要删除该行。

答案 11 :(得分:0)

为了它的价值,当我在Mac上创建一个IntelliJ项目,然后将项目移动到我的Windows机器上时遇到了这个问题。我不得不手动打开每个文件并更改IntelliJ窗口右下角的编码设置。可能不会发生在大多数情况下,如果有人阅读这个问题,但这可以节省我几个小时的工作......

答案 12 :(得分:0)

ubuntu$> vi source.cpp

:set binary noeol