Git end-of-line conversion can create bugs in your software

We were experiencing a strange bug with a C# library with an embedded binary file. It worked on the developers machine, but not after it was released after being built on a build server.

It turns out that the developer had git checkout end-of-line settings that preserved the LF character, while the build server converted from LF to CR LF upon checkout. This corrupted the binary file that was embedded into the library as an embedded resource. Git didn't recognise the file type and interpreted it as a (partial) text file.

The fix

I think the preferred way to avoid this is to include a .gitattributes file in the root-folder of your repo. In the .gitattributes file you specify how git should handle different file types. For us the solution was to add the following:

*.pgm binary

I first found the solution for this in an answer on Stack Overflow, How to change line-ending settings.

Alternative

It's also possible to avoid this by changing the git setting core.autocrlf to either input or false, but this will change the behaviour for all files.