Подтвердить что ты не робот

Что делает "! Eol" в gitattributes?

Недавно я наткнулся на следующую запись в файле .gitattributes:

"* text=auto !eol"

Что делает !eol?

4b9b3361

Ответ 1

Git имеет 2 атрибута, которые относятся к концам строк:

  • текст

Документация гласит:

Этот атрибут включает и контролирует нормализацию конца строки. Когда текстовый файл нормализуется, его окончания строки преобразуются в LF в репозитории

Это фактически означает, что, когда вы передаете репо, он преобразует линейные окончания в LF

  1. EOL

Документация гласит:

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

Итак, в то время как текстовый атрибут влияет на то, как будет выглядеть файл IN REPO, eol влияет на то, как выглядит файл в рабочем каталоге.

Теперь атрибут может иметь 4 состояния:

установить без значения
Пример: * text

снята с охраны
Пример: * -text

с определенным значением
Пример: * text=auto

неопределенные
Пример: * !text

Итак, * text=auto !eol означает следующее:

Все файлы имеют атрибут text, установленный в auto, и атрибут eol неуказанный. Читая документацию, мы обнаруживаем, что text = auto означает, что вы разрешаете git решать, является ли файл текстовым, и если он его нормализует (установите ограничения строк в репо на LF).

!eol означает, что атрибут eol установлен явно неопределенным. В этом случае это то же самое, что вообще не указывать его, инструктируя git посмотреть на настройку конфигурации core.eol, чтобы посмотреть, как справляться с концами строк в рабочем каталоге. Обратите внимание:

Переменная конфигурации core.eol контролирует, какие окончания строк git будут использоваться для нормализованных файлов в вашем рабочем каталоге; по умолчанию используется внутренняя строка, заканчивающаяся для вашей платформы, или CRLF, если установлен core.autocrlf.

Но вы бы использовали! eol в ситуации, подобной следующей:

* text=auto eol=CRLF
test.txt !eol

в основном переопределяя атрибут eol из CRLF до неуказанного для test.txt. Это означает, что для всех файлов, кроме test.txt, git будет конвертировать на EOL ELE в CRLF, но ничего не сделает для test.txt.

Ответ 2

* text=auto !eol

означает:

  • для двоичных файлов не будет выполнено преобразование EOL (конец строки).
  • для текстовых файлов EOL преобразуются в OS-зависимый EOL (конвертировать в LF для Unix и CR + LF для Windows) после проверки файла и замены LF во время проверки.

Ответ 3

В основном это отключает eol в соответствии с документацией:

Иногда вам нужно переопределить параметр атрибута для путь к состоянию Unspecified. Это можно сделать, указав имя атрибут с префиксом восклицательного знака!.

eol выполняет следующие действия:

Этот атрибут устанавливает определенный стиль окончания строки, который будет использоваться в за работой        каталог. Он позволяет нормализовать окончание строки без какого-либо контента        проверяет, эффективно устанавливает текстовый атрибут.

Ответ 4

Краткая версия:

Если Git решает, что содержимое является текстом, его окончание строки нормируется на LF при регистрации. Отмените любую явную настройку eol в каком-то вложенном файле .gitattributes.

См. man gitattributes:

   Each line in gitattributes file is of form:

       pattern attr1 attr2 ...

   Sometimes you would need to override an setting of an attribute for a path to
   Unspecified state. This can be done by listing the name of the attribute
   prefixed with an exclamation point !.

   text
       This attribute enables and controls end-of-line normalization. When a text
       file is normalized, its line endings are converted to LF in the
       repository. To control what line ending style is used in the working
       directory, use the eol attribute for a single file and the core.eol
       configuration variable for all text files.

       Set to string value "auto"
           When text is set to "auto", the path is marked for automatic
           end-of-line normalization. If Git decides that the content is text,
           its line endings are normalized to LF on checkin.

   eol
       This attribute sets a specific line-ending style to be used in the working
       directory. It enables end-of-line normalization without any content
       checks, effectively setting the text attribute.