Мне действительно нужно указать все двоичные файлы в .gitattributes

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

Однако я также читал, что Git довольно хорошо обнаруживает двоичные файлы, что заставляет меня думать, что это не нужно. Итак, мой вопрос: действительно ли мне нужно указывать эти явные настройки для каждого отдельного расширения файла в моем репозитории? Я видел некоторые рекомендации сделать это для всех расширений файлов изображений.

# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto

# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary

13
1 640
2

Ответы:

Git, как правило, хорошо определяет, является ли файл текстовым или двоичным, поэтому вам может не понадобиться явно что-либо устанавливать. Как вы заметили, установка по умолчанию * text=auto — хорошая идея.

Однако, если вы или кто-либо другой, работающий над проектом, работает с файлами в кодировке UTF-16, рекомендуется явно установить атрибут text для этих файлов, а также атрибут working-tree-encoding, поскольку Git заметит в них байты NUL. и думайте о них как о бинарных.

Вы также должны указать любой тип файла как двоичный, который, по вашему мнению, может быть ошибочно принят за текст. Например, если у вас есть какой-то формат изображения или файл, состоящий только из байтов ASCII, которые можно распечатать, Git может ошибочно распознать его как текст. Вы хотели бы указать эти файлы явно, чтобы избежать путаницы. Только вы знаете, какие файлы в вашем репозитории могут столкнуться с этой проблемой.


Решено

Git проверит первые 8000 байт файла, чтобы увидеть, содержит ли он символ NUL. Если это так, предполагается, что файл является двоичным.

Из исходный код git:

#define FIRST_FEW_BYTES 8000
int buffer_is_binary(const char *ptr, unsigned long size)
{
    if (FIRST_FEW_BYTES < size)
        size = FIRST_FEW_BYTES;
    return !!memchr(ptr, 0, size);
}

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

По большей части вам не нужно явно объявлять тип файла (я не думаю, что когда-либо делал это). На самом деле, просто объявите конкретный файл, если у вас возникнут проблемы.