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

129

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

Физер Хан
источник

Ответы:

77

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

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

pattern attr1 attr2 ...

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

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

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

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

Неопределенные

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

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

   core.autocrlf

Установка для этой переменной значения «истина» почти то же самое, что установка для текстового атрибута значения «авто» для всех файлов, за исключением того, что нормализация текстовых файлов не гарантируется: файлы, содержащие 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 неправильно угадал для файла изображения, что это текстовый файл, что привело к его повреждению, поскольку он заменил байты CR + LF байтами LF в базе данных объектов. Это было неинтересно отлаживать.

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

Флимм
источник
2
Почему все называют LF нормальным, а не CRLF? есть ли ссылка, чтобы доказать это?
Юша Алеайуб
1
@YoushaAleayoub Что ты имеешь в виду?
Flimm
1
@YoushaAleayoub, если вы ссылаетесь everyoneна git-scmэто, вероятно, потому, что они разрабатывают пакет * nix, и поэтому использование символа новой строки * nix является нормальным .
Джастин Мо,
4
@YoushaAleayoub LF считается "нормальным" b / c, это часто встречается во многих инструментах разработки. Популярные инструменты разработки, например, git-scmиз * nix. MacOS использует LF. Только Windows (учитывая только ОС основного потока) использует CRLF. Это усложняет разработчикам, использующим инструменты * nix в Windows, и всем при обмене файлами. См. Также Почему CRLF .
Рой Дантон
2
@Flimm, не могли бы вы объяснить разницу между *.txt text=autoи, *.txt textпожалуйста? Я думал, что все 4 строки в приведенном выше примере должны были быть text=auto, а не только textпосле расширения файла. Файлы посадочных мест KiCad, например (расширение ".kicad_mod"), нормализуются с помощью этой строки в их файле gitattributes: *.kicad_mod text=auto( kicad-pcb.org/libraries/klc/G1.7 ).
Габриэль Стейплс
64

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

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

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

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

Дэйв Зих
источник
12
Что вы имеете в виду под нормализованным окончанием строки?
Fizer Khan
14
When a text file is normalized, its line endings are converted to LF in the repository.
Dave Zych
11
Важно знать, что это перезаписывает локальную настройку core.autocrlf на вашем компьютере см. Этот отличный ответ @Daniel Jomphe
spankmaster79
1
Было бы очень хорошо, если бы git просто не выполнял $% # ни с одним из файлов, возвращаемых в репозиторий. Я "ве работал с ОДС, неволей, MSBuild, Source Depot, TFS, SVM, ни один из них не изменится даже один байт в любом из файлов Это коварный мерзавец хак ИМО , и это вызвало у меня много боли..
Vance McCorkle
1
То, что происходит при оформлении заказа, - это только половина дела - что происходит при получении? Было бы правильно сказать, что при оформлении заказа концы строк остаются такими же LF, даже в окнах?
Энтони
8

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

Карл Цёллер
источник