我非常确定我了解No newline at end of file的含义。我想提供我很久以前创建并重新设置基础的分支的拉取请求(提交可能来自添加.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 .
,由于*.java text
(应该尝试*.java text
),它应该将所有行尾都转换为LF,但是没有显示任何更改(针对{{ 1}})和HEAD
仍显示行尾差异。
git diff
不会导致find ./ -type f -name '*.java' -exec dos2unix {} \;
识别任何更改,并且git status
仍显示行结束更改(而工作目录没有暂存或未暂存的更改)。 / p>
我对隐藏所做的更改不感兴趣,就像git diff master
那样。
我在Ubuntu 18.04上使用git diff --ignore-all-space
2.17.1。
答案 0 :(得分:1)
问题是我已经不了解这种变化是如何存在的...
此更改显示a/
文件的whatever.java
版本缺少换行符,而文件b/
版本具有换行符。 “缺少换行符”意味着文件以 no 行终止符结尾-这不是CRLF与LF的问题,而是“具有终止符”与“没有终止符”的问题。
某些编辑器能够处理最后一行缺少终结符的文件。其他编辑器则没有,甚至没有注意到缺少一个编辑器(大多数只是假装有一个)。如果看起来合适,某些编辑器会默认添加终止符,也许带有警告。这里有很多变化。
您没有显示产生差异的特定git diff
命令(带有哪些选项),因此很难说出a/
和b/
版本的来源,但是我假设HEAD
提交并且下面是index
或工作树。 (也就是说,我们正在查看修剪后的git diff --cached
或git diff HEAD
输出。无论哪种方式,我们都会看到相同的内容,因为git diff
必须通过任何{{ 1}}过滤器和任何行尾过滤器。)
...因为有一个
clean
[包含].gitattributes
...,然后运行
*.java text
,它将所有行尾都转换为LF ...
这会将工作树中任何现有的CRLF行结尾转换为索引中仅LF行结尾。我不认为这会为根本没有结尾的行添加LF结尾(基于crlf_to_git
in convert.c
中的代码)。
因此,这表明文件的工作树副本将最后一个CRLF作为文件的最后两个字节,或者将最后一个仅LF换行符作为文件的最后一个字节。 Git会git rm --cached -r . && git add .
作为最后的换行符。同时,如果提交本身的最后一个字节是一个孤单的大括号(根本没有 no 结尾,CRLF和newlne都不行),则表示已提交(git add
该文件的副本与同一文件的索引版本不同,因为已提交的副本完全没有任何行终止符,您将看到的确是您所看到的。
答案 1 :(得分:1)
问题:\文件末尾没有换行符
$ 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“在删除最后一行文本后追加最后一行文本” >> 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)