Domanda

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.

È stato utile?

Soluzione

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top