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

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

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

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

Когда вы работаете над проектами с Git и GitHub, Git может дать неожиданные результаты, если, например, вы работаете на Windows-машине, а ваш соавтор внес изменения в macOS.

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

## Глобальные параметры для окончаний строк

Команда `git config core.autocrlf` используется для изменения способа обработки окончаний строк в Git. Она принимает один аргумент.

<div class="ghd-tool mac">

В macOS вы просто передаете в конфигурацию параметр `input`. Например:

```shell
$ git config --global core.autocrlf input
# Configure Git to ensure line endings in files you checkout are correct for macOS
```

</div>

<div class="ghd-tool windows">

В Windows вы просто передаёте `true` в конфигурацию. Например:

```shell
$ 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.
```

</div>

<div class="ghd-tool linux">

В Linux вы просто передаете в конфигурацию параметр `input`. Например:

```shell
$ git config --global core.autocrlf input
# Configure Git to ensure line endings in files you checkout are correct for Linux
```

</div>

## Параметры для отдельных репозиториев

При необходимости можно настроить `.gitattributes` файл для управления тем, как Git считывает конец строки в определенном репозитории. При фиксации этого файла в репозитории Git переопределяет параметр `core.autocrlf` для всех участников репозитория. Это гарантирует согласованное поведение для всех пользователей независимо от параметров и среды Git.

Файл `.gitattributes` должен быть создан в корне репозитория и зафиксирован, как и любой другой файл.

`.gitattributes` Файл выглядит как таблица с двумя столбцами:

* В левом столбце содержатся имена файлов Git для сопоставления.
* В правом столбце содержатся конфигурации окончаний строк, которые Git должен использовать для соответствующих файлов.

### Пример

Ниже приведен пример `.gitattributes` файла. Его можно использовать в качестве шаблона для ваших репозиториев:

```text
# 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 — определение атрибутов на путь](https://www.git-scm.com/docs/gitattributes#_marking_files_as_binary) в документации по Git.
1. Чтобы избежать потери локальных изменений в файлах в репозитории, добавьте и зафиксируйте все выдающиеся изменения, выполнив следующие команды.

   ```shell copy
   git add . -u
   git commit -m "Saving files before refreshing line endings"
   ```

1. Чтобы обновить все файлы в текущей ветви, чтобы отразить новую конфигурацию, выполните следующую команду.

   ```shell copy
   git add --renormalize .
   ```

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

   ```shell copy
   git status
   ```

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

   ```shell copy
   git commit -m "Normalize all the line endings"
   ```

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

* [Настройка Git — атрибуты Git](https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes) в книге Pro Git
* [git-config](https://git-scm.com/docs/git-config) на страницах руководств для Git
* [Начало работы — первая настройка Git](https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup) в книге Pro Git
* [Учитывайте окончания строк](http://adaptivepatchwork.com/2012/03/01/mind-the-end-of-your-line/), автор: [Тим Клем](https://github.com/tclem)