Предотвратить нормализацию EOL для файлов CSV

У меня есть исходный репозиторий, который используется как в Windows, так и в Linux.

Я знаю, что Git автоматически преобразует EOL в местный стандарт: \r\n в Windows и \n на Линукс.

Это не проблема для исходных файлов.

Но у меня есть несколько файлов CSV, которые используют фиксированный формат с заданным символом EOL (\r\n), который не следует изменять, но Git также преобразует их, нарушая некоторые код.

Я попытался предотвратить преобразование EOL для файлов CSV, создав файл .gitattributes в корне рядом с файлом .gitignore со следующим содержимым:

*.csv    -text

Я применил то, что понял из: http://git-scm.com/docs/gitattributes< /а>

Но Git по-прежнему конвертирует \r\n в \n в Linux.

Должен ли я играть с другой настройкой, такой как auto.crlf?

Обратите внимание, что у меня ограниченный контроль над локальным репозиторием Linux, так как им управляет сервер непрерывной интеграции Jenkins.

Спасибо за любой вклад.


person Pragmateek    schedule 27.01.2014    source источник
comment
Расширения файлов в Linux чувствительны к регистру. Ваши CSV-файлы на самом деле имеют *.CSV? Попробуйте добавить несколько вариантов регистра в файл .gitattributes.   -  person Paul Hicks    schedule 27.01.2014
comment
Вы пробовали *.csv eol=crlf?   -  person Achal Dave    schedule 27.01.2014
comment
@PaulHicks: спасибо, но все расширения написаны в формате csv в нижнем регистре.   -  person Pragmateek    schedule 27.01.2014
comment
@AchalDave: спасибо за предложение, но некоторые другие файлы CSV могут быть отформатированы с помощью \n вместо \r\n, поэтому я не могу применить единую политику преобразования, я хотите отключить любое преобразование.   -  person Pragmateek    schedule 27.01.2014


Ответы (1)


Обратите внимание, что git использует LF как внутреннее представление EOL.

Это означает, что в вашем случае файлы *.csv были изменены при их добавлении/фиксации.

Таким образом, решение выглядит примерно так:

  1. удалите все файлы *.csv, зафиксируйте это изменение
  2. отредактируйте .gitattributes, зафиксируйте
  3. добавьте обратно все файлы *.csv, снова зафиксируйте

На самом деле все это можно сделать за один коммит с помощью следующих команд:

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

Объяснение:

  • git rm --cached удаляет из индекса все файлы csv, оставляя их на диске;
  • убедитесь, что файлы имеют окончания строки CRLF (в качестве примера я использую unix2dos)
  • git add '*.csv' добавляет их обратно, на этот раз без преобразования, согласно новой версии .gitattributes
person kasal    schedule 27.01.2014