Почему Git конвертирует CRLF в LF в Linux?

У меня есть несколько сценариев оболочки, которые должны иметь LF-окончания (я на Ubuntu 14.04). Поскольку это кроссплатформенный проект с открытым исходным кодом, .gitattributes Файл используется для автоматического завершения концов строк. К сожалению, нет.

$ cat .gitattributes
# automatically normalize line endings
* text=auto

У меня есть следующий файл в моей файловой системе:

$ file extract.sh 
extract.sh: Bourne-Again shell script, ASCII text executable, with CRLF line terminators

Если я сейчас обработаю это с помощью dos2unix, он показывает правильно, как LF завершен.

$ file extract.sh 
extract.sh: Bourne-Again shell script, ASCII text executable

Также, git показывает это как измененный:

$ git status
[..]
Changes not staged for commit:
[..]

    modified:   extract.sh

Теперь я добавляю его в индекс:

$ git add extract.sh 
warning: LF will be replaced by CRLF in extract.sh.
The file will have its original line endings in your working directory.

Но новый git status показывает это:

$ git status .
[..]

nothing to commit, working directory clean

А также file показывает это как неизменное:

$ file extract.sh 
extract.sh: Bourne-Again shell script, ASCII text executable

Однако, если я удаляю это и проверяю это снова:

$ rm extract.sh 
$ git checkout extract.sh
$ file extract.sh 
extract.sh: Bourne-Again shell script, ASCII text executable, with CRLF line terminators
$ git status .
[..]

nothing to commit, working directory clean

Даже удаление из кеша не помогает:

$ git rm --cached extract.sh
$ git reset --hard
$ file extract.sh 
extract.sh: Bourne-Again shell script, ASCII text executable, with CRLF line terminators

Вопрос за 100 долларов: как мне заставить git выдать мне файл с LF-завершением?

1 ответ

Решение

От http://git-scm.com/book/en/Customizing-Git-Git-Configuration

Если вы работаете в системе Linux или Mac, в которой используются окончания строк LF, вы не хотите, чтобы Git автоматически конвертировал их при извлечении файлов; однако, если файл с окончаниями CRLF случайно вводится, вы можете захотеть, чтобы Git это исправил. Вы можете указать Git преобразовывать CRLF в LF при фиксации, но не наоборот, установив для core.autocrlf значение input:

git config --global core.autocrlf input
Другие вопросы по тегам