Git с autocrlf=true проверяет файлы со смешанными окончаниями строк как есть
Итак, я всегда думал, что с помощью core.autocrlf=true
Git заменяет все LF
окончания на CRLF
при извлечении файла в рабочий каталог.
Из книги Git :
Если вы работаете на машине с Windows, установите значение true – это преобразует окончания LF в CRLF при извлечении кода
Однако при проверке файла со смешанными окончаниями строк и core.autocrlf
, установленным в true
, моя версия Git проверяет файл как есть.
Я нашел очень удобный репозиторий GitHub для проверки этого поведения - https://github.com/YueLinHo/TestAutoCrlf
Результаты испытаний:
- файл только с окончаниями
LF
(LF.формат txt)- с
autocrlf=false
: проверено как есть (все окончания строкиLF
) - с
autocrlf=true
: Все окончания строк изменяются наCRLF
при проверке
- с
- файл со смешанным окончания строк (MIX-more_CRLF.тхт, микс-more_LF.формат txt)
- с
autocrlf=false
: проверено как есть (смесьLF
иCRLF
) - с
autocrlf=true
: проверено как есть (смесьLF
иCRLF
)
- с
Почему это происходит? Я не видел ничего о autocrlf=true
не трогать файлы со смешанными окончаниями строк.
Виноваты ли мои настройки Git? Я проверил настройку core.autocrlf
, запущенную git config --get core.autocrlf
в папке репозитория после проверки с помощью autocrlf=true
в глобальном .gitconfig, а также команда вернулась истинной. Здесь нет.gitattributes файл для перезаписи настроек.
.
EDIT: то же самое поведение в последней версии msysgit 1.9.5.msysgit.1
.
Моя первоначальная проблема заключается в том, что мне каким-то образом удалось зафиксировать файл со смешанной строкой с окончаниями только LF
, имея core.autocrlf
, установленный в true
, что означает, что файл был извлечен как есть, но изменен с CRLF
на LF
. В настоящее время я работаю с другой машины и не может воспроизвести это поведение на моей версии msysgit.
2 ответа:
Я перепечатываю ответ, который был удален его владельцем, потому что я думаю, что он дает лучшее объяснение. Я понятия не имею, почему автор удалил его, я думаю, что это правильно, и я проголосовал за восстановление.
По-видимому, это поведение жестко закодировано в Git и не зависит от ядра.safecrlf (и я проверил это, смешанные файлы остаются нетронутыми, даже если я установилgit config core.safecrlf false
.Первоначальный ответ следующий:
Autocrlf не преобразует смешанные окончания строк, как это делает git исходный код говорит:
Https://github.com/git/git/commit/a0ad53c18100226cb1a138cb9b3bc3615170be8f
Обратите внимание на комментарии здесь:
/* No "naked" LF? Nothing to convert, regardless. */
И
/* If we have any CR or CRLF line endings, we do not touch it */ /* This is the new safer autocrlf-handling */
Преобразование смешанных окончаний строк необратимо, когда это сделано, Git разбился.
Итак, если вы хотите конвертировать окончания строк ваших файлов автоматически, было бы неплохо установить .gitattributes файл, имеющий дело с концом строки. Например:
LF.txt eol=lf CRLF.txt eol=crlf