Search code examples
gitgithubeolend-of-line

Prevent EOL normalization for CSV files


I have a source repository that is used both from Windows and Linux.

I know that Git will automatically convert EOL to the local standard: \r\n on Windows and \n on Linux.

This is not an issue for source files.

But I have some CSV files that use a fixed format with a given EOL character (\r\n) which should not be changed, but Git converts them too, breaking some code.

I've tried to prevent EOL conversions for CSV files by creating a .gitattributes file at the root, next to the .gitignore file, with the following content:

*.csv    -text

I've applied what I've understood from: http://git-scm.com/docs/gitattributes

But Git is still converting \r\n to \n on Linux.

Should I play with another setting like auto.crlf?

Note that I have limited control of the Linux local repository as it is managed by the continuous integration server Jenkins.

Thanks for any input.


Solution

  • Please note that git uses LF as an internal representation of EOL.

    This means that in your case, the *.csv files has got changed when they were added/committed.

    So the solution goes roughly like this:

    1. remove all the *.csv files, commit that change
    2. edit .gitattributes, commit
    3. add back all the *.csv files, commit again

    Actually, it can be all made in one commit, with the following commands:

    ### ... update .gitattributes
    git rm --cached '*.csv'
    ### ... find -name '*.csv' -print0| xargs -0 unix2dos
    git add '*.csv'
    git add .gitattributes
    git commit
    

    Explanation:

    • git rm --cached removes all csv files from index, leaving them on the disk;
    • ensure the files have CRLF line endings (I'm using unix2dos as an example)
    • git add '*.csv' adds them back, this time without any transformation, according to new version of .gitattributes