Git认为我每次做一个小改动都会重写我的一个文件

时间:2008-10-28 20:01:18

标签: git diff

我有一个中等大小的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 个答案:

答案 0 :(得分:26)

显然,git不喜欢你的mac风格的行结尾(仅限CR)。它的diff算法使用LF作为行分隔符。

修复您的文件,使其具有Windows样式(CR LF)或unix(仅限LF)行结尾。

答案 1 :(得分:19)

要解决这个问题,我不需要更改任何核心git设置,因为生成的默认行结尾很好,只是这个特定的文件被破坏了。为了解决这个问题,我打开了vim并执行了以下命令

:%s/^M/\r/g

请注意,要键入“^ M”,您必须键入ctrl-V然后键入ctrl-M。

答案 2 :(得分:4)

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

从您的粘贴示例来看,您可能也会遇到“旧式Mac行结尾”(感谢提示ddaaCharles Bailey),这只是{{1}没有任何CR的情况,没有由git处理的情况。如果这是真的(使用十六进制编辑器检查),请使用recode之类的工具将此垃圾转换为21世纪的格式,如正确的LF - 仅限Unix行结尾。

答案 3 :(得分:1)

git diff -b

在向您显示差异时忽略行结束更改。