tags:

views:

1301

answers:

4

I have a medium size Java file. Everytime I make a change to one of my files, BuildTable.java, Git reports it as a massive change, even if is only a line or two. BuildTable.java is about 200 lines and the change in this commit only changed a single line.

git-diff ouputs this:

--- 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

After doing a git-commit -a

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

Is Git seeing this file as binary or something? Is this a problem? If it is, how do I fix this?

+5  A: 

Clearly, git does not like your mac-style line endings (CR only). Its diff algorithm uses LF as the line separator.

Fix your files to have windows-style (CR LF) or unix (LF only) line endings.

ddaa
OS X uses LF endings just like every other style of Unix out there.
Paul Wicks
So called "mac-style" line endings were standard on Macs up to MacOS 9. And only on MacOS.
ddaa
It's pretty sad this answer was downmodded four times, while the diagnostic was correct, as the question author noted in his answer.
ddaa
+2  A: 

Set core.autocrlf and core.safecrlf with git-config. This will cause git to automatically convert line endings when transferring from/to the object store. You might need to make a commit to store the "new" endings.

Judging from your pasted example, you might be also suffering from "old-style Mac line endings" (thanks to ddaa and Charles Bailey for the hint), which are only bare CRs without any LF, a case not handled by git. If this is true (check with a hex editor), use a tool like recode to translate this garbage into some 21st century format, like proper LF-only Unix line endings.

David Schmitt
core.autocrlf is not going to help in this case (old-style Mac line endings). To quote the current git source: "We're currently not going to even try to convert stuff that has bare CR characters. Does anybody do that crazy stuff?"
Charles Bailey
+6  A: 

To fix this, I didn't need to change any of the core git settings, as the default line endings being generated were fine, it was just that this particular file was mangled. To fix it I opened vim and did the following command

:%s/^M/\r/g

Note that to type the "^M" you have to type ctrl-V and then ctrl-M.

Paul Wicks
A: 
git diff -b

Ignores end of line changes when showing you the differences.

Andrew Grimm