当执行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楼
实际上,这确实会引起问题,因为行尾会自动修改为脏文件,而无需对其进行任何更改。 请参阅此帖子以获取解决方法。
#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代码编辑器打开文件
该编辑器清楚地显示了最后一行,您可以根据需要删除该行。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3162067