Почему 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