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.

  • SourceTree App says uncommitted changes even for newly-cloned repository - what could be wrong?
  • How to change the behavior of git status showing modified files which are eventually not committed?
  • 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.

  • Doctrine migrations: How to avoid SQL errors in the postUp step?
  • Can't find Git or Cordova on your path (Windows/Netbeans), Can't find GitHub under AppData/Local, FIX 2015
  • Android studio 1.4 and VCS (git) can not commit code
  • Why do I have to use “git commit -a” rather than just “git commit”?
  • Should I commit my `.idea/` folder?
  • xCode 4.5 git merge fails to commit or give errors
  • One Solution collect form web for “Prevent EOL normalization for CSV files”

    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
    Git Baby is a git and github fan, let's start git clone.