Все статьи

CRLF против LF: почему символы конца строки до сих пор важны

В корпоративной среде на постсоветском пространстве 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, но важно применить преобразование ко всему файлу, а не только к визуально «подозрительным» строкам, иначе проблема останется скрытой.

Попробовать инструмент