В корпоративной среде на постсоветском пространстве Windows по-прежнему остаётся основной рабочей системой — от бухгалтерии на 1С до рабочих станций разработчиков, — поэтому конфликт CRLF/LF здесь встречается едва ли не чаще, чем в командах, где по умолчанию работают на macOS или Linux.
Откуда взялось расхождение
Unix и macOS используют один символ — LF (line feed, \n). Windows унаследовала от старых телетайпов пару символов — CRLF (carriage return + line feed, \r\n): один возвращает каретку в начало строки, второй перемещает на строку ниже — буквальная имитация печатной машинки.
Почему это до сих пор важно
- Git. Установщик Git for Windows на этапе настройки прямо спрашивает, как обращаться с окончаниями строк — большинство разработчиков нажимают «далее», не вдумываясь в вопрос, а потом удивляются, почему git показывает «изменён весь файл» при правке одной строки.
- Shebang-скрипты. Скрипт для Unix-shell с окончаниями CRLF может не запуститься на сервере, потому что интерпретатор видит лишний символ
\rв первой строке. - Сравнение строк в коде. Строка, прочитанная из CRLF-файла, может не совпасть при сравнении с ожидаемой LF-строкой, даже если видимый текст одинаков.
Как это решают
Настройка core.autocrlf в git автоматически конвертирует окончания строк при checkout/commit: значение true обычно рекомендуют для Windows, input — для Linux и macOS. Файл .gitattributes в репозитории решает проблему надёжнее, потому что задаёт стиль окончаний для конкретных типов файлов независимо от локальных настроек каждого разработчика.
Зачем нужна ручная конвертация
- Исправить файл, который попал в репозиторий с неправильным стилем окончаний строк.
- Подготовить скрипт для деплоя на Linux-сервер, который редактировали в Windows-редакторе вроде Notepad++.
- Продиагностировать, почему текстовое сравнение двух на вид одинаковых файлов показывает отличие.
Смешанные окончания в одном файле
Файл, отредактированный в нескольких редакторах или на разных ОС, может содержать и CRLF, и LF одновременно — часть строк с одним стилем, часть с другим. Это самый капризный случай: конвертация «в LF» на первый взгляд ничего не меняет для строк, у которых уже был LF, но важно применить преобразование ко всему файлу, а не только к визуально «подозрительным» строкам, иначе проблема останется скрытой.