文件末尾没有换行符

人走茶凉 提交于 2020-02-26 04:36:38

当执行git diff它说“文件末尾没有换行符”

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

该消息的意义是什么,它试图告诉我们什么?


#1楼

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


#2楼

如果您在现有文件的末尾添加新的文本行,但在末尾还没有newline character ,则diff会将旧的最后一行显示为已修改,即使从概念上来说不是。

这至少是在末尾添加newline character一个很好的理由。

文件包含:

A() {
    // do something
}

十六进制转储:

00000000: 4128 2920 7b0a 2020 2020 2f2f 2064 6f20  A() {.    // do 
00000010: 736f 6d65 7468 696e 670a 7d              something.}

您现在将其编辑为

A() {
    // do something
}
// Useful comment

十六进制转储:

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 diff将显示:

-}
\ No newline at end of file
+}
+// Useful comment.

换句话说,它显示出比概念上更大的差异。 它显示您删除了}行,并添加了}\\n 。 实际上,这是发生的事情,但从概念上讲不是发生的事情,因此可能会造成混淆。


#3楼

实际上,这确实会引起问题,因为行尾会自动修改为脏文件,而无需对其进行任何更改。 请参阅此帖子以获取解决方法。

git用CRLF替换LF


#4楼

这不仅是不良的样式,而且在文件上使用其他工具时,可能会导致意外的行为。

这是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

最后,如果要添加新行,这会使您的差异变得更加嘈杂。 如果添加了第三行,它将显示对第二行以及新添加的内容的编辑。


#5楼

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

但是,某些编辑器(如linux中的gedit)会在文件末尾静默添加换行符。 使用这种编辑器时,您不会摆脱此消息。

我试图克服的问题是使用Visual Studio代码编辑器打开文件

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!