当做一个git差异,它说“没有换行在文件末尾”。
这条信息的意义是什么,它想告诉我们什么?
当做一个git差异,它说“没有换行在文件末尾”。
这条信息的意义是什么,它想告诉我们什么?
当前回答
唯一的原因是Unix在历史上有一个约定,所有人类可读的文本文件都以换行符结束。在当时,这避免了在显示或连接文本文件时进行额外的处理,并避免了将文本文件与包含其他类型数据的文件区别对待(例如原始二进制数据,它不是人类可读的)。
由于这种惯例,那个时代的许多工具都期望结尾换行符,包括文本编辑器、差分工具和其他文本处理工具。Mac OS X是建立在BSD Unix上的,而Linux是为了与Unix兼容而开发的,所以这两个操作系统继承了相同的惯例、行为和工具。
Windows并不是为了与unix兼容而开发的,所以它没有相同的约定,大多数Windows软件都可以很好地处理没有末尾换行符的情况。
但是,由于Git首先是为Linux开发的,而许多开源软件是建立在unix兼容的系统上,如Linux、Mac OS X、FreeBSD等,大多数开源社区及其工具(包括编程语言)继续遵循这些惯例。
在1971年,有一些技术上的原因是合理的,但在这个时代,它主要是为了保持与现有工具的兼容性。
其他回答
唯一的原因是Unix在历史上有一个约定,所有人类可读的文本文件都以换行符结束。在当时,这避免了在显示或连接文本文件时进行额外的处理,并避免了将文本文件与包含其他类型数据的文件区别对待(例如原始二进制数据,它不是人类可读的)。
由于这种惯例,那个时代的许多工具都期望结尾换行符,包括文本编辑器、差分工具和其他文本处理工具。Mac OS X是建立在BSD Unix上的,而Linux是为了与Unix兼容而开发的,所以这两个操作系统继承了相同的惯例、行为和工具。
Windows并不是为了与unix兼容而开发的,所以它没有相同的约定,大多数Windows软件都可以很好地处理没有末尾换行符的情况。
但是,由于Git首先是为Linux开发的,而许多开源软件是建立在unix兼容的系统上,如Linux、Mac OS X、FreeBSD等,大多数开源社区及其工具(包括编程语言)继续遵循这些惯例。
在1971年,有一些技术上的原因是合理的,但在这个时代,它主要是为了保持与现有工具的兼容性。
如果您在现有文件的末尾添加了新的文本行,而该文本行末尾还没有换行符,则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。这就是实际发生的情况,但不是概念上的情况,所以会让人困惑。
之所以采用这种惯例,是因为在类unix操作系统上,换行符被视为行结束符和/或消息边界(这包括进程之间的管道、行缓冲等)。
例如,考虑将只有换行符的文件视为单个空行。相反,长度为0字节的文件实际上是一个没有任何行的空文件。可以通过wc -l命令确认。
总的来说,这种行为是合理的,因为如果\n字符只是行分隔符而不是行结束符,那么就没有其他方法来区分空文本文件和只有一行空的文本文件。因此,有效的文本文件应该总是以换行符结束。唯一的例外是文本文件是空的(没有行)。
ubuntu$> vi source.cpp
:set binary noeol
这不仅仅是糟糕的样式,还可能导致在文件上使用其他工具时出现意想不到的行为。
下面是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
最后,如果你要添加一个新的行,它会使你的差异稍微更嘈杂。如果您添加了第三行,它将显示对第二行以及新添加的内容的编辑。