Сведения об окончаниях строк
Каждый раз, когда вы нажимаете клавишу ВВОД на клавиатуре, вы вставляете в строку невидимый символ, называемый окончанием строки. Разные операционные системы обрабатывают окончания строк по-разному.
При совместной работе над проектами в Git и GitHub Enterprise Server 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 автоматически определяет, являются ли файлы в репозитории текстовыми или двоичными файлами. Чтобы избежать повреждения двоичных файлов в репозитории, рекомендуется явно пометить файлы как двоичные в
.gitattributes
. Дополнительные сведения см. в разделе gitattributes — определение атрибутов на путь в документации по Git. -
Чтобы избежать потери локальных изменений в файлах в репозитории, добавьте и зафиксируйте все выдающиеся изменения, выполнив следующие команды.
Shell git add . -u git commit -m "Saving files before refreshing line endings"
git add . -u git commit -m "Saving files before refreshing line endings"
-
Чтобы обновить все файлы в текущей ветви, чтобы отразить новую конфигурацию, выполните следующие команды.
Shell git rm -rf --cached . git reset --hard HEAD
git rm -rf --cached . git reset --hard HEAD
-
Чтобы отобразить перезаписанные, нормализованные файлы, выполните следующую команду.
Shell git status
git status
-
При необходимости, чтобы зафиксировать все невыполненные изменения в репозитории, выполните следующую команду.
Shell git commit -m "Normalize all the line endings"
git commit -m "Normalize all the line endings"
Дополнительные материалы
- Настройка Git — атрибуты Git в книге Pro Git
- git-config на страницах руководств для Git
- Начало работы — первая настройка Git в книге Pro Git
- Учитывайте окончания строк, автор: Тим Клем