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?
These changes mean that metadata about your file changed, however the content of your file did not. If you're working in a group, this may start to intefere with pushes or just add noise to your commits.
Git uses heuristics to determine if a change was a renaming or copying of a file, and also if it is a "rewriting" of the file. Roughly speaking, if the diff between the old and new version is bigger than the new version itself, it's a "rewrite".
Diffing is a function that takes two input data sets and outputs the changes between them. git diff is a multi-use Git command that when executed runs a diff function on Git data sources. These data sources can be commits, branches, files and more.
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.
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 executed the following command
:%s/^M/\r/g
Note that to type the "^M" you have to type ctrl-V and then ctrl-M.
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 CR
s 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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With