当做一个git差异,它说“没有换行在文件末尾”。

这条信息的意义是什么,它想告诉我们什么?


当前回答

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

然而,一些编辑器,如linux中的gedit,会在文件末尾无声地添加换行符。在使用这种编辑器时,您无法删除此消息。

我试图克服这个问题的是用visual studio代码编辑器打开文件

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

其他回答

源文件通常由工具连接(C, c++:头文件,Javascript:捆绑器)。如果省略换行符,可能会引入令人讨厌的错误(一个源文件的最后一行与下一个源文件的第一行相连)。希望所有的源代码连接工具都在连接文件之间插入换行符,但情况并非总是如此。

问题的关键在于——在大多数语言中,换行符具有语义意义,而文件结束符并不是语言定义的换行符的替代品。因此,您应该用换行符结束每个语句/表达式——包括最后一个。

What

当做一个git差异,它说“没有换行在文件末尾”。

在某些方面,是的,但它更微妙和微妙。

当执行git diff时,git会显示文件版本之间的差异,显示为文件不同的块。这可能包括文件末尾的块。

如果文件的两个版本都没有以换行符结束,则读取数据块的末尾

\ No newline at the end of file

而如果只有一个版本不以换行符结束,则数据块将以任意一个版本结束

-last line
\ No newline at the end of file
+new last line

or

-last line
+new last line
\ No newline at the end of file

Why?

这条消息的意义是什么

原因很简单。git diff的主要目的之一是明确地显示更改,以便它可以用作git apply的输入。要做到这一点,Git需要知道在应用diff时对换行符应该做什么。它应该删除、保留还是更改换行符?

文件末尾的No换行符就是这样做的一种方式。对于希望了解此类更改的人来说,这也很有帮助,因为在某些情况下,是否有换行符对文件很重要。

它想告诉我们什么?

好吧,只是在这个文件的末尾没有换行符。或者以前没有,现在有了。或者曾经有过,但现在没有了。

这实际上会导致一个问题,因为行结束符会自动修改,而不会对文件进行任何更改。请参阅这篇文章以获得解决方案。

git用CRLF替换LF

有一件事我在之前的回答中没有看到。关于没有行尾的警告可能是在文件的一部分被截断时发出的警告。这可能是数据丢失的症状。

这不仅仅是糟糕的样式,还可能导致在文件上使用其他工具时出现意想不到的行为。

下面是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

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