Skip to main content

Настройка Git для обработки окончаний строк

Чтобы избежать проблем в объектах diff, можно настроить Git для правильной обработки окончаний строк.

Platform navigation

Сведения об окончаниях строк

Каждый раз, когда вы нажимаете клавишу ВВОД на клавиатуре, вы вставляете в строку невидимый символ, называемый окончанием строки. Разные операционные системы обрабатывают окончания строк по-разному.

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

  1. Перед добавлением или фиксацией изменений убедитесь, что Git правильно применил конфигурацию. Например, Git автоматически определяет, являются ли файлы в репозитории текстовыми или двоичными файлами. Чтобы избежать повреждения двоичных файлов в репозитории, рекомендуется явно пометить файлы как двоичные в .gitattributes. Дополнительные сведения см. в разделе gitattributes — определение атрибутов на путь в документации по Git.

  2. Чтобы избежать потери локальных изменений в файлах в репозитории, добавьте и зафиксируйте все выдающиеся изменения, выполнив следующие команды.

    Shell
    git add . -u
    git commit -m "Saving files before refreshing line endings"
    
  3. Чтобы обновить все файлы в текущей ветви, чтобы отразить новую конфигурацию, выполните следующие команды.

    Shell
    git rm -rf --cached .
    git reset --hard HEAD
    
  4. Чтобы отобразить перезаписанные, нормализованные файлы, выполните следующую команду.

    Shell
    git status
    
  5. При необходимости, чтобы зафиксировать все невыполненные изменения в репозитории, выполните следующую команду.

    Shell
    git commit -m "Normalize all the line endings"
    

Дополнительные материалы