Git认为我每次进行小改动时都在重写一个文件

9

我有一个中等大小的Java文件。每次我修改其中一个文件,BuildTable.java,Git都会将其报告为大量更改,即使只有一两行。BuildTable.java大约有200行,这个提交中的更改只改变了一行。

git-diff输出如下:

--- a/src/BuildTable.java
+++ b/src/BuildTable.java
@@ -1 +1 @@
-import java.io.FileNotFoundException;^Mimport java.io.FileReader;^Mimport java.io.InputStreamReader;^Mimport java.io.PushbackReader;^Mimport java.util.ArrayList;^Mimport
\ No newline at end of file
+import java.io.FileNotFoundException;^Mimport java.io.FileReader;^Mimport java.io.InputStreamReader;^Mimport java.io.PushbackReader;^Mimport java.util.ArrayList;^Mimport
\ No newline at end of file

执行git-commit -a命令后

Created commit fe43985: better error notifications
 3 files changed, 54 insertions(+), 50 deletions(-)
 rewrite src/BuildTable.java (78%)

Git是否将此文件视为二进制文件或其他类型文件?这会造成问题吗?如果有问题,我该如何解决?

4个回答

27

显而易见,git不支持mac风格的行结尾(仅CR)。它的diff算法使用LF作为行分隔符。

将您的文件修复为windows风格(CR LF)或unix风格(仅LF)的行结尾。


2
OS X 使用 LF 结尾,就像其他所有风格的 Unix 一样。 - Paul Wicks
8
所谓的“Mac风格”换行符在MacOS 9及以下版本中是标准格式,且仅适用于MacOS系统。 - ddaa
7
这个回答被踩了四次,很令人难过,尽管问题作者在他的回答中指出了诊断是正确的。我觉得这很可惜。 - ddaa

20
为了解决这个问题,我不需要更改任何核心git设置,因为生成的默认行结束符是正确的,只是这个特定的文件被破坏了。为了修复它,我打开了vim并执行了以下命令。
:%s/^M/\r/g
请注意,要键入“^M”,您需要先按ctrl-V,然后再按ctrl-M。

我已经搜寻了好几天,而你刚刚解决了我的问题。谢谢。 - Jared

4

使用git-config设置core.autocrlfcore.safecrlf。这将导致git在从/到对象存储传输时自动转换行尾。您可能需要进行提交以存储“新”的行尾。

根据您贴出的示例,您可能还遭受着“旧式Mac行尾”(感谢ddaaCharles Bailey的提示),它们只是裸露的CR而没有任何LF,这是git无法处理的情况。如果是这样(请使用十六进制编辑器检查),请使用类似recode的工具将此垃圾转换为21世纪格式,例如适当的仅LF-Unix行结尾。


1
core.autocrlf在这种情况下没有帮助(旧式Mac行结尾)。引用当前的git源代码:“我们目前甚至不会尝试转换具有裸CR字符的东西。有人做那种疯狂的事吗?” - CB Bailey

0
git diff -b

在显示差异时忽略行末的更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接