Сведения об окончаниях строк
Каждый раз, когда вы нажимаете клавишу ВВОД на клавиатуре, вы вставляете в строку невидимый символ, называемый окончанием строки. Разные операционные системы обрабатывают окончания строк по-разному.
При совместной работе над проектами в Git и GitHub Git может выдавать непредвиденные результаты, например, если вы работаете на компьютере Windows, а ваш коллега внес изменение в macOS.
Чтобы эффективно взаимодействовать с пользователями, использующими разные операционные системы, вы можете настроить обработку окончаний строк в Git.
Глобальные параметры для окончаний строк
Команда git config core.autocrlf
используется для изменения способа обработки окончаний строк в Git. Она принимает один аргумент.
В macOS вы просто передаете в конфигурацию параметр input
. Пример:
$ git config --global core.autocrlf input
# Configure Git to ensure line endings in files you checkout are correct for macOS
В Windows вы просто передаете в конфигурацию параметр true
. Пример:
$ git config --global core.autocrlf true
# Configure Git to ensure line endings in files you checkout are correct for Windows.
# For compatibility, line endings are converted to Unix style when you commit files.
В Linux вы просто передаете в конфигурацию параметр input
. Например:
$ git config --global core.autocrlf input
# Configure Git to ensure line endings in files you checkout are correct for Linux
Параметры для отдельных репозиториев
При необходимости можно настроить файл .gitattributes, чтобы управлять тем, как Git считывает окончания строк в определенном репозитории. При фиксации этого файла в репозитории Git переопределяет параметр core.autocrlf
для всех участников репозитория. Это гарантирует согласованное поведение для всех пользователей независимо от параметров и среды Git.
Файл .gitattributes должен быть создан в корне репозитория и зафиксирован так же, как и любой другой файл.
Файл .gitattributes представляет собой таблицу с двумя столбцами:
- В левом столбце содержатся имена файлов Git для сопоставления.
- В правом столбце содержатся конфигурации окончаний строк, которые Git должен использовать для соответствующих файлов.
Пример
Ниже приведен пример файла .gitattributes. Его можно использовать в качестве шаблона для ваших репозиториев:
# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto
# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text
# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf
# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
Вы видите типы сопоставляемых файлов, разделенные пробелами (*.c
, *.sln
, *.png
), после которых указывается параметр — text
, text eol=crlf
, binary
. Мы рассмотрим некоторые возможные параметры ниже.
-
text=auto
Git будет обрабатывать файлы наилучшим образом. Это хороший вариант по умолчанию. -
text eol=crlf
Git будет всегда преобразовывать окончания строк вCRLF
при извлечении. Этот вариант следует использовать для файлов, которые должны поддерживать окончанияCRLF
, даже в OSX или Linux. -
text eol=lf
Git будет всегда преобразовывать окончания строк вLF
при извлечении. Этот вариант следует использовать для файлов, которые должны поддерживать окончания LF, даже в Windows. -
binary
Git поймет, что указанные файлы не являются текстом и изменять их не следует. Параметрbinary
также является псевдонимом для-text -diff
.
Обновление репозитория после изменения окончаний строк
Если задать параметр core.autocrlf
или зафиксировать файл .gitattributes, можно обнаружить, что Git сообщает об изменениях в файлах, которые вы не выполняли. Git изменил окончания строк в соответствии с новой конфигурацией.
Чтобы все окончания строк в репозитории соответствовали новой конфигурации, создайте резервную копию файлов с помощью Git, удалите все файлы в репозитории (кроме каталога .git
), а затем восстановите все файлы одновременно.
- Сохраните текущие файлы в Git, чтобы ваши изменения не были потеряны.
$ git add . -u $ git commit -m "Saving files before refreshing line endings"
- Добавьте все измененные файлы обратно и нормализуйте окончания строк.
$ git add --renormalize .
- Откройте перезаписанные, нормализованные файлы.
$ git status
- Зафиксируйте изменения в репозитории.
$ git commit -m "Normalize all the line endings"
Дополнительные материалы
- Настройка Git — атрибуты Git в книге Pro Git
- git-config на страницах руководств для Git
- Начало работы — первая настройка Git в книге Pro Git
- Учитывайте окончания строк, автор: Тим Клем