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

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

"* text=auto !eol"

Что значит !eol делать?

4 ответа

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

  1. текст

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

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

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

  1. EOL

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

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

Таким образом, хотя атрибут text влияет на то, как файл будет выглядеть в репо, 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 в CRLF, но ничего не будет делать для test.txt.

* text=auto !eol

предполагает:

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

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

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

eol делает следующее:

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

Укороченная версия:

Если 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.
Другие вопросы по тегам