繁体   English   中英

在 git diff 中避免“文件末尾没有换行符”

[英]Avoid "No newline at end of file" in git diff

我很确定我明白文件末尾没有换行符是什么意思。 我想提供一个我很久以前创建并重新定位的分支的拉取请求(提交可能是在添加.gitattributes之前的时间)。 我看到一些.java源代码文件只有更改

-}
\ No newline at end of file
+}

无论配置如何,我都希望将这些更改从 PR 提交中排除。 我想避免使用git difftool选择更改并扩大我对git理解。

问题是我已经不明白这种变化是如何存在的,因为有一个.gitattributes

# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto

# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text
*.java text
*.css text
*.js text
*.xml text
*.dtd text
*.xsl text
*.properties text
*.txt text
*.svg text
*.yml text
*.md text

# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf

# Denote all files that are truly binary and should not be modified.
*.png binary
*.gif binary
*.jpg binary
*.jpeg binary
*.eot binary
*.ttf binary
*.woff binary
*.woff2 binary

在存储库中,我运行了git rm --cached -r . && git add . git rm --cached -r . && git add . 由于*.java text (也尝试过*.java text ),它应该将所有行尾转换为 LF,但是没有显示任何更改(针对HEAD )并且git diff仍然显示行尾差异。

find ./ -type f -name '*.java' -exec dos2unix {} \\; 不会导致git status识别任何更改,并且git diff master仍然显示行结束更改(而工作目录没有暂存或未暂存的更改)。

我对隐藏更改不感兴趣,就像git diff --ignore-all-space那样。

我在 Ubuntu 18.04 上使用git 2.17.1。

问题是我已经不明白这种变化是如何存在的......

更改表明, whatever.java文件的a/版本缺少换行符,而文件的b/版本有一个换行符。 “缺少换行符”意味着文件以没有行终止符结尾——这不是 CRLF 与 LF 的问题,而是“有终止符”与“没有终止符”的问题。

一些编辑器能够处理最后一行没有终止符的文件。 其他编辑没有,甚至没有注意到缺少一个(主要是假装有一个)。 如果看起来合适,一些编辑器会默认添加终止符,可能会发出警告。 这里有很多变化。

您没有显示哪个特定的git diff命令(带有哪些选项)生成了差异,因此很难说a/b/版本来自哪里,但我会假设HEAD提交和要么index要么工作-下面的树。 (也就是说,我们正在查看修剪后的git diff --cachedgit diff HEAD输出。无论哪种方式,我们都会看到同样的事情,因为git diff必须通过任何clean过滤器和任何结尾运行工作树文件- 线过滤。)

...因为有一个.gitattributes [包括]

 *.java text

...我跑了git rm --cached -r . && git add . git rm --cached -r . && git add . 这应该将所有行尾转换为 LF ...

这会将工作树中任何现有的 CRLF 行结尾转换为索引中的 LF-only 行结尾。 我不相信它会将 LF 结尾添加到根本没有结尾的行(基于convert.ccrlf_to_git的代码)。

因此,这表明文件的工作树副本将最终 CRLF 作为文件的最后两个字节,或者将最终的仅 LF 换行字节作为文件的最后一个字节。 Git 将git add作为最后的换行符。 同时,如果提交本身有一个单独的大括号(根本没有行结尾,既不是 CRLF 也不是 newlne)作为它的最后一个字节,这意味着文件的提交( HEAD )副本与索引版本不同通过让提交的副本完全没有任何行终止符来创建相同的文件,您将看到您所看到的内容。

问题:\\ 文件末尾没有换行符

$ git diff
diff --git a/abc.txt b/abc.txt
index 5996e61..6a3c3a9 100644
--- a/abc.txt
+++ b/abc.txt
{
+  **Actual change**
FR(srctxt,reptxt,fname)
else:
-    os._exit(1)
\ No newline at end of file
+    os._exit(1)

解决方案:使用echo -n "APPEND LAST LINE TEXT AFTER REMOVING THE LAST LINE TEXT" >>abc.txt删除最后一行并附加不带换行符的同一行

$ **echo -n "    os._exit(1)" >> abc.txt**

$ **git diff**
diff --git a/abc.txt b/abc.txt
index 5996e61..f2b2e74 100644
--- a/abc.txt
+++ b/abc.txt
@@ -419,6 +419,7 @@ EStatus 
{
+  **Actual change**
FR(srctxt,reptxt,fname)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM