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 файл для перезаписи настроек.

Все тесты проводились на версии Git

.

EDIT: то же самое поведение в последней версии msysgit 1.9.5.msysgit.1.

Моя первоначальная проблема заключается в том, что мне каким-то образом удалось зафиксировать файл со смешанной строкой с окончаниями только LF, имея core.autocrlf, установленный в true, что означает, что файл был извлечен как есть, но изменен с CRLF на LF. В настоящее время я работаю с другой машины и не может воспроизвести это поведение на моей версии msysgit.

2 4

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

Какова величина core.safecrlf ?

Если core.safecrlf установлено в true, то файлы смешанных окончаний строк не будут преобразованы. (Поскольку преобразование не является обратимым, если концы строк смешаны)