Что делает "! Eol" в gitattributes?
Недавно я наткнулся на следующую запись в файле.gitattributes:
"* text=auto !eol"
Что значит !eol
делать?
4 ответа
Git имеет 2 атрибута, которые имеют дело с концом строк:
- текст
Документация гласит:
Этот атрибут включает и контролирует нормализацию конца строки. Когда текстовый файл нормализован, его окончания строк преобразуются в LF в хранилище
Это фактически означает, что когда вы фиксируете репо, он преобразует окончания строк в LF
- 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.