避免在git diff

时间:2018-08-21 23:17:00

标签: git line-endings gitattributes lf

我非常确定我了解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。

2 个答案:

答案 0 :(得分:1)

  

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

此更改显示a/文件的whatever.java版本缺少换行符,而文件b/版本具有换行符。 “缺少换行符”意味着文件以 no 行终止符结尾-这不是CRLF与LF的问题,而是“具有终止符”与“没有终止符”的问题。

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

您没有显示产生差异的特定git diff命令(带有哪些选项),因此很难说出a/b/版本的来源,但是我假设HEAD提交并且下面是index或工作树。 (也就是说,我们正在查看修剪后的git diff --cachedgit 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)