Why does Git treat this text file as a binary file?
Solution 1:
It simply means that when git inspects the actual content of the file (it doesn't know that any given extension is not a binary file - you can use the attributes file if you want to tell it explicitly - see the man pages).
Having inspected the file's contents it has seen stuff that isn't in basic ascii characters. Being UTF16 I expect that it will have 'funny' characters so it thinks it's binary.
There are ways of telling git if you have internationalisation (i18n) or extended character formats for the file. I'm not sufficiently up on the exact method for setting that - you may need to RT[Full]M ;-)
Edit: a quick search of SO found can-i-make-git-recognize-a-utf-16-file-as-text which should give you a few clues.
Solution 2:
If you have not set the type of a file, Git tries to determine it automatically and a file with really long lines and maybe some wide characters (e.g. Unicode) is treated as binary. With the .gitattributes file you can define how Git interpretes the file. Setting the diff attribute manually lets Git interprete the file content as text and will do an usual diff.
Just add a .gitattributes to your repository root folder and set the diff attribute to the paths or files. Here's an example:
src/Acme/DemoBundle/Resources/public/js/i18n/* diff
doc/Help/NothingToSay.yml diff
*.css diff
If you want to check if there are attributes set on a file, you can do that with the help of git check-attr
git check-attr --all -- src/my_file.txt
Another nice reference about Git attributes could be found here.
Solution 3:
I was having this issue where Git GUI and SourceTree was treating Java/JS files as binary and thus wouldn’t show a diff.
Creating a file named attributes
in .git/info
with following content solved the problem:
*.java diff
*.js diff
*.pl diff
*.txt diff
*.ts diff
*.html diff
*.sh diff
*.xml diff
If you would like this to apply to all repositories, then you can add the file attributes
in $HOME/.config/git/attributes
.