Какова цель `text = auto` в файле`.gitattributes`?

В основном .gitattributes файл имеет * text=auto. Какова цель text=auto в этом файле?

Ответ 1

Это обеспечивает нормализацию концов строк. Источник: Kernel.org

Когда для текста установлено значение "auto", путь помечается для автоматической нормализации конца строки. Если git решит, что содержимое является текстом, его окончания строк нормализуются до LF при регистрации.

Если вы хотите взаимодействовать с системой управления исходным кодом, которая обеспечивает нормализацию конца строки, или вы просто хотите, чтобы все текстовые файлы в вашем хранилище были нормализованы, вы должны вместо этого установить для текстового атрибута "auto" для всех файлов.

Это гарантирует, что все файлы, которые git считает текстовыми, будут иметь нормализованные (LF) окончания строк в хранилище.

Ответ 2

Из документов:

Каждая строка в файле .gitattributes (или .git/info/attributes) имеет форму:

pattern attr1 attr2 ...

Итак, шаблон *, что означает все файлы, а атрибут text=auto.

Что делает text=auto? Из документации:

Когда текст установлен на "авто", путь указывается для автоматической нормализации окончательной строки. Если Git решает, что контент является текстом, его окончание строки нормируется на LF при регистрации.

Какое поведение по умолчанию, если оно не включено?

Не выбрано

Если текстовый атрибут не указан, Git использует конфигурационную переменную core.autocrlf, чтобы определить, должен ли файл быть преобразован.

Что делает core.autocrlf? Из документов:

   core.autocrlf

Установка этой переменной в "true" почти такая же, как установка текстового атрибута на "авто" для всех файлов, за исключением того, что текстовые файлы не гарантируются normalized: файлы, содержащие CRLF в репозитории, не будут затронуты. Используйте этот параметр, если вы хотите, чтобы линии CRLF заканчивались в вашей рабочей хотя репозиторий не имеет нормализованных окончаний строк. Эта переменная может быть установлена ​​на вход, и в этом случае преобразование вывода не выполняется.

Если вы думаете, что все это так ясно, как грязь, вы не одиноки.

Здесь, что * text=auto делает в моих словах:, когда кто-то фиксирует файл, Git угадывает, является ли этот файл текстовым файлом или нет, и если это так, он совершит версию файла, где все байты CR + LF заменяются байтами LF. Это не влияет на то, какие файлы выглядят в рабочем дереве, есть другие настройки, которые будут конвертировать LF байты в CR + LF байты при проверке файла.

Рекомендация:

Я бы не рекомендовал помещать * text=auto в файл .gitattributes. Вместо этого я бы рекомендовал что-то вроде этого:

*.txt text
*.html text
*.css text
*.js text

Это явно указывает, какие файлы являются текстовыми файлами, которые преобразуют CRLF в LF в базу данных объектов (но не обязательно в рабочем дереве). У нас было репо с * text=auto, а Git догадалось, что для файла изображения он был текстовым файлом, что привело к его повреждению, поскольку он заменил байты L + LF байтами LF в базе данных объектов. Это было не весело отлаживать.

Если вы должны использовать * text=auto, поместите его как первую строку в .gitattributes, чтобы более поздние строки могли переопределить его. Это, кажется, становится все более популярной практикой.

Ответ 3

Эта конфигурация относится к тому, как обрабатываются концы строк. Когда включено, все концы строк преобразуются в LF в репозитории. Существуют и другие флаги, касающиеся того, как концы строк преобразуются в ваш рабочий каталог. Полная информация о нас здесь: https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html