当做一个git差异,它说“没有换行在文件末尾”。
这条信息的意义是什么,它想告诉我们什么?
当做一个git差异,它说“没有换行在文件末尾”。
这条信息的意义是什么,它想告诉我们什么?
当前回答
之所以采用这种惯例,是因为在类unix操作系统上,换行符被视为行结束符和/或消息边界(这包括进程之间的管道、行缓冲等)。
例如,考虑将只有换行符的文件视为单个空行。相反,长度为0字节的文件实际上是一个没有任何行的空文件。可以通过wc -l命令确认。
总的来说,这种行为是合理的,因为如果\n字符只是行分隔符而不是行结束符,那么就没有其他方法来区分空文本文件和只有一行空的文本文件。因此,有效的文本文件应该总是以换行符结束。唯一的例外是文本文件是空的(没有行)。
其他回答
这实际上会导致一个问题,因为行结束符会自动修改,而不会对文件进行任何更改。请参阅这篇文章以获得解决方案。
git用CRLF替换LF
如果您在现有文件的末尾添加了新的文本行,而该文本行末尾还没有换行符,则diff将显示最后一行已被修改的旧文本行,尽管在概念上它并没有被修改。
这至少是在末尾添加换行符的一个好理由。
例子
文件包含:
A() {
// do something
}
Hexdump:
00000000: 4128 2920 7b0a 2020 2020 2f2f 2064 6f20 A() {. // do
00000010: 736f 6d65 7468 696e 670a 7d something.}
现在将其编辑为
A() {
// do something
}
// Useful comment
Hexdump:
00000000: 4128 2920 7b0a 2020 2020 2f2f 2064 6f20 A() {. // do
00000010: 736f 6d65 7468 696e 670a 7d0a 2f2f 2055 something.}.// U
00000020: 7365 6675 6c20 636f 6d6d 656e 742e 0a seful comment..
git差异将显示:
-}
\ No newline at end of file
+}
+// Useful comment.
换句话说,它显示了比概念上发生的更大的差异。它显示您删除了行}并添加了行}\n。这就是实际发生的情况,但不是概念上的情况,所以会让人困惑。
它表示在文件末尾没有换行符(通常是\n,也就是LF或CRLF)。
也就是说,简单地说,文件中的最后一个字节(如果在Windows系统中,则为字节)不是换行符。
之所以显示此消息,是因为没有办法区分末尾有换行符和没有换行符的文件。Diff无论如何都必须输出换行符,否则结果将难以读取或自动处理。
注意,在文本文件中,如果文件格式允许,总是将换行符作为最后一个字符是一种很好的风格。此外,例如,对于C和c++头文件,它是语言标准所要求的。
源文件通常由工具连接(C, c++:头文件,Javascript:捆绑器)。如果省略换行符,可能会引入令人讨厌的错误(一个源文件的最后一行与下一个源文件的第一行相连)。希望所有的源代码连接工具都在连接文件之间插入换行符,但情况并非总是如此。
问题的关键在于——在大多数语言中,换行符具有语义意义,而文件结束符并不是语言定义的换行符的替代品。因此,您应该用换行符结束每个语句/表达式——包括最后一个。
它只是指出文件的末尾没有换行符。这不是一个灾难,这只是一个信息,让它更清楚地表明,在查看命令行中的差异时,不存在差异。