Вы правы в том, что текстовые и двоичные файлы на самом деле являются просто объектами BLOB.Если бы это было все, что было в истории, все было бы проще, но это не так, поэтому они не.: -)
(Вы также можете указать Git выполнить различные операции фильтрации входных файлов. Здесь опять нет разницы между текстовыми и двоичными файлами с точки зрения того, что фильтры делают , но - это разница в , когда фильтры применяются по умолчанию: Если вы используете автоматический режим, Git отфильтрует файл, который Git считает текстом,и не фильтровать файл, который Git считает двоичным. Но это имеет значение только в том случае, если вы используете автоматическое обнаружение и преобразование конца строки только для CRLF / LF.)
Я бы предположил, что если бы различныеФайлы 1ГБ в цитате более или менее одинаковы, хороший алгоритм сжатия это выяснит и может сохранить все из них даже в объеме менее 1ГБ, если они повторяются ...
Может быть, а может и нет.Git имеет два отдельных алгоритма сжатия.Как сказал Нуфал Ибрагим , один из этих двух - дельта-сжатие - применяется только в том, что Git называет пакетными файлами .Другой - zlib , который применяется ко всему.
Zlib - это общий алгоритм сжатия, основанный на конкретном процессе моделирования (см. Есть ли алгоритм для "идеального")?сжатие? для фона).Он имеет тенденцию работать довольно хорошо на обычном тексте, и не очень хорошо на некоторых двоичных файлах.Он имеет тенденцию делать уже сжатые файлы больше , поэтому, если ваши входные данные в 1 ГБ уже сжаты, они, вероятно, будут (незначительно) больше после сжатия zlib.Но все это общности;чтобы выяснить, как он работает с вашими конкретными данными, нужно запустить его на ваших конкретных данных.
Дельта-кодирование, которое использует Git, происходит «до» сжатия zlib и работает с двоичными данными.По сути, он находит длинные двоичные последовательности байтов, которые совпадают в объектах «ранее» и «позже» (здесь «ранее» и «позже» определены довольно свободно, но Git навязывает определенный порядок обхода и сравнения объектов по причинам)обсуждается здесь ) и, если возможно, заменяет некоторую длинную последовательность из N байтов на «ссылаясь на более ранний объект, захватывает N байтов из смещения O».
Если вы попробуете это на больших двоичных файлах,оказывается, что он обычно работает довольно хорошо на парах связанных, больших, несжатых двоичных файлов, которые имеют некоторую локальность данных, так как «более поздний» двоичный файл имеет тенденцию иметь много длинных повторов«более ранний» файл и очень плохо на больших сжатых двоичных файлах или двоичных файлах, представляющих структуры данных, которые слишком часто перетасовываются (так что повторяющиеся двоичные строки стали очень фрагментированнымит. е. больше не будет ).Итак, еще раз, это в значительной степени зависит от данных: попробуйте на ваши конкретные данные , чтобы посмотреть, хорошо ли это работает для вас.