Git и двоичные данные, лучший способ хранения

Я нахожусь в печальной ситуации необходимости хранить некоторые двоичные файлы в git,

Однако я могу выбрать способ хранения данных на диске - в Git (в нашем собственном формате, который должен читать только сборочный компьютер).

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

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

  • Бинарный сжатый (например, PNG (изображение), FLAC (звук))
  • Двоичный несжатый (например, PPM (изображение), Uncompressed-WAV (звук))
  • ASCII-представление двоичных данных (например, кодирование MIME, XPM (изображение))

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

Мне интересно знать:

  • Какие параметры будут хранить совершенно новый двоичный двоичный объект каждый раз, когда двоичный файл изменяется (даже несколько байтов).
  • Делает ли git diff несжатые двоичные данные лучше, чем сжатые данные (что может сильно измениться даже при незначительном редактировании несжатых данных).
  • Я хотел бы предположить, что хранение большого количества небольших двоичных файлов в долгосрочной перспективе менее затратно, чем один большой двоичный файл, при условии, что периодически изменяются только некоторые файлы. Может ли Git эффективно обрабатывать небольшие изменения в больших двоичных файлах?

Учитывая все вышесказанное, каковы наилучшие варианты для того, чтобы избежать большого git-репо (так как изменения вносятся в бинарные файлы), предполагая, что использование бинарных файлов невозможно избежать полностью?

1 ответ

Решение

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

Все они. Все BLOB-объекты (в действительности, все объекты в репо) хранятся "нетронутыми" (более или менее), когда они являются "незакрепленными объектами". Единственное, что с ними делается, - это дать им заголовок и сжать их с помощью сжатия с раздувом.

В то же время, однако, незакрепленные предметы в конечном итоге объединяются в "пачки". Git выполняет дельта-сжатие для файлов в пакетах: см. Стандартизирован ли алгоритм git для двоичных различий (дельта-хранилище)?, Основываясь на полученных там ответах, было бы гораздо лучше не "предварительно сжимать" двоичные файлы, чтобы дельта-алгоритм пакетного файла мог находить длинные строки совпадающих двоичных данных.

Делает ли git diff несжатые двоичные данные лучше, чем сжатые данные (что может сильно измениться даже при незначительном редактировании несжатых данных).

Я не пробовал это, но общий смысл состоит в том, что ответом на это должно быть "да".

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

Конечно, все файлы, которые полностью не изменились, будут немедленно сохранены с большим количеством "дедупликации", так как их контрольные суммы SHA-1 будут идентичны для всех коммитов, так что каждое дерево называет один и тот же большой двоичный объект в хранилище. Если foo.icon один и тот же в тысячах коммитов, есть только один блоб (независимо от того, для какого SHA-1 foo.icon оказывается) хранится.


Я бы порекомендовал немного поэкспериментировать: создать несколько фиктивных тестовых репозиториев с предлагаемыми двоичными файлами, внести предложенные изменения и посмотреть, насколько велики репо до и после запуска. git gc упаковать незакрепленные предметы. Обратите внимание, что существует много настраиваемых параметров; в частности, вы можете возиться с window, depth а также window-memory настройки (которые можно установить в командной строке или в записях git config).

Другие вопросы по тегам