Prevent EOL normalization for CSV files
Asked Answered
E

1

6

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.

Etruscan answered 27/1, 2014 at 0:37 Comment(4)
The file extensions on linux are case-sensitive. Are your CSV files actually *.CSV? Try adding a few case variations to your .gitattributes file.Phocomelia
Have you tried *.csv eol=crlf?Aplenty
@PaulHicks: thanks but all extensions are "csv" in lower case.Etruscan
@AchalDave: thanks for the suggestion but some other CSV files may be formatted with \n instead of \r\n so I can't apply a uniform conversion policy, I want to disable any conversion.Etruscan
C
8

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
Constipate answered 27/1, 2014 at 10:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.