在执行git diff
时,它会说“文件末尾没有换行符”。
好的,文件末尾没有换行符。有什么大不了的?
这条消息有什么意义,它试图告诉我们什么?
答案 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)
这确实会导致问题,因为行结尾会自动修改弄脏文件而不对其进行任何更改。请参阅此帖以获得解决方案。
答案 10 :(得分:1)
您的原始文件可能没有换行符。
但是,Linux中的某些编辑器如 gedit 会默默地在文件末尾添加换行符。使用这种编辑器时,你无法摆脱这条消息。
我尝试克服此问题的方法是使用visual studio code editor
打开文件此编辑器清楚地显示最后一行,您可以根据需要删除该行。
答案 11 :(得分:0)
为了它的价值,当我在Mac上创建一个IntelliJ项目,然后将项目移动到我的Windows机器上时遇到了这个问题。我不得不手动打开每个文件并更改IntelliJ窗口右下角的编码设置。可能不会发生在大多数情况下,如果有人阅读这个问题,但这可以节省我几个小时的工作......
答案 12 :(得分:0)
ubuntu$> vi source.cpp
:set binary noeol