当做一个git差异,它说“没有换行在文件末尾”。
这条信息的意义是什么,它想告诉我们什么?
当做一个git差异,它说“没有换行在文件末尾”。
这条信息的意义是什么,它想告诉我们什么?
当前回答
这不仅仅是糟糕的样式,还可能导致在文件上使用其他工具时出现意想不到的行为。
下面是test.txt:
first line
second line
最后一行没有换行符。让我们看看文件中有多少行:
$ wc -l test.txt
1 test.txt
也许这就是您想要的,但在大多数情况下,您可能希望文件中有2行。
此外,如果你想合并文件,它可能不会像你期望的那样表现:
$ cat test.txt test.txt
first line
second linefirst line
second line
最后,如果你要添加一个新的行,它会使你的差异稍微更嘈杂。如果您添加了第三行,它将显示对第二行以及新添加的内容的编辑。
其他回答
它表示在文件末尾没有换行符(通常是\n,也就是LF或CRLF)。
也就是说,简单地说,文件中的最后一个字节(如果在Windows系统中,则为字节)不是换行符。
之所以显示此消息,是因为没有办法区分末尾有换行符和没有换行符的文件。Diff无论如何都必须输出换行符,否则结果将难以读取或自动处理。
注意,在文本文件中,如果文件格式允许,总是将换行符作为最后一个字符是一种很好的风格。此外,例如,对于C和c++头文件,它是语言标准所要求的。
唯一的原因是Unix在历史上有一个约定,所有人类可读的文本文件都以换行符结束。在当时,这避免了在显示或连接文本文件时进行额外的处理,并避免了将文本文件与包含其他类型数据的文件区别对待(例如原始二进制数据,它不是人类可读的)。
由于这种惯例,那个时代的许多工具都期望结尾换行符,包括文本编辑器、差分工具和其他文本处理工具。Mac OS X是建立在BSD Unix上的,而Linux是为了与Unix兼容而开发的,所以这两个操作系统继承了相同的惯例、行为和工具。
Windows并不是为了与unix兼容而开发的,所以它没有相同的约定,大多数Windows软件都可以很好地处理没有末尾换行符的情况。
但是,由于Git首先是为Linux开发的,而许多开源软件是建立在unix兼容的系统上,如Linux、Mac OS X、FreeBSD等,大多数开源社区及其工具(包括编程语言)继续遵循这些惯例。
在1971年,有一些技术上的原因是合理的,但在这个时代,它主要是为了保持与现有工具的兼容性。
核心问题是你如何定义“线”以及是否“结束在线” 字符序列是否是行的一部分。基于unix的编辑 (如VIM)或工具(如Git)使用EOL字符序列作为 行结束符,因此它是直线的一部分。它类似于 在C和Pascal中使用分号(;)。在C中,分号终止 在Pascal中,它把它们分开了。
这不仅仅是糟糕的样式,还可能导致在文件上使用其他工具时出现意想不到的行为。
下面是test.txt:
first line
second line
最后一行没有换行符。让我们看看文件中有多少行:
$ wc -l test.txt
1 test.txt
也许这就是您想要的,但在大多数情况下,您可能希望文件中有2行。
此外,如果你想合并文件,它可能不会像你期望的那样表现:
$ cat test.txt test.txt
first line
second linefirst line
second line
最后,如果你要添加一个新的行,它会使你的差异稍微更嘈杂。如果您添加了第三行,它将显示对第二行以及新添加的内容的编辑。
您的原始文件可能没有换行符。
然而,一些编辑器,如linux中的gedit,会在文件末尾无声地添加换行符。在使用这种编辑器时,您无法删除此消息。
我试图克服这个问题的是用visual studio代码编辑器打开文件
这个编辑器清楚地显示了最后一行,您可以根据需要删除该行。