insert_final_newline

对于 Linux,任何一行文本都必须以换行符 (newline) 作为结束标记,即一行代表该行内容再加上 LF 换行符。如果文件的最后一行缺少了 LF 换行符,那么就会导致 Linux 的有些工具处理时丢弃该行。

换行符在编辑器中是以行后面有新行表示的,如果行是最后一行,那么其后必须跟空行来确保文件最后一行是完整行。

对于 Git,如果我们修改或提交的某个文件没有以空行结尾,那么:

  1. Git 就会在 diff 输出的该末尾行后添加 \ No newline at end of file 提示
  2. Github 上对应提交显示的该文件的末尾行后会出现 🚫 标记,用来提示该文件最后一行不是完整行
  3. 污染提交记录。例如在该行后面新加一行,此时 diff 显示不仅是添加了一个新行,而是修改之前行并添加了新行。(因为添加新行,原本的最后一行就代表添加了换行符,所以又有改动。当然,如果添加的新行没有添加换行符(视觉空行),那新的 diff 仍会对文件末尾行显示 \ No newline at end of file 提示)
$ notepad 1.txt
$ git add .
$ git commit -m "update"
[master 7675cd2] update
 1 file changed, 1 insertion(+)
 create mode 100644 1.txt
$ notepad 1.txt
$ git diff
diff --git a/1.txt b/1.txt
index 5d93580..f8be7bb 100644
--- a/1.txt
+++ b/1.txt
@@ -1 +1,2 @@
-line1
\ No newline at end of file
+line1
+line2
\ No newline at end of file

对于 Windows,虽说换行符是 CRLF,但是完整一行的视觉显示也是行后必须有新行,如果是最后一行,其后面也必须跟空行才能表示完整行。但是 Windows 对最后一行是不是完整行没有强制要求,如果不是,也没有任何问题。

只不过你 Windows 写的代码提交后一般会因为 core.autocrlf = true 设置在提交时自动将换行符转换成 LF 格式。这时如果你没有在文件尾添加空行,那对应转换的 LF 换行格式的文件尾行后也没有空行。(因为要有 CRLF 空行才会转成对应的 LF 空行)这样一来,仍旧会在 diff 中显示 \ No newline at end of file 提示,团队内的 Linux/Mac 成员拉取到的也是有问题的末尾行。

所以为了保证文件以一个换行符结束,我们可以使用 .editorconig 来设置:

# 保存时始终在文件尾部插入换行符(视觉空行)
[*]
insert_final_newline = true