Как git работает со сжатыми файлами?

У меня есть немного svg файлы, которые я хочу отслеживать git, Тем не менее, большинство программного обеспечения может прозрачно иметь дело с svgz (что в основном svg.gz). Поэтому я собирался перейти на svgz сэкономить место на диске.

Каковы плюсы и минусы их наличия svgz вместо svg из git в перспективе?

Моя наивная идея заключается в том, что git Алгоритмыdiff оптимизированы для текстовых файлов и не будут одинаково хорошо работать с их сжатыми аналогами. Поскольку различия также сжаты, я предполагаю, что общий подход очень эффективен для текстовых файлов, где различия занимают очень мало дискового пространства. Вместо этого, для сжатых данных, он будет иметь тенденцию сохранять большие файлы внутри, и в конечном итоге я ожидаю, что в какой-то момент хранилище может занять больше места для сжатых файлов.

1 ответ

Git использует вариант Xdelta в пакетных файлах. Это отдельно от текстовых различий (для которых Git использует вариант XDiff). Все хранимые объекты Git также сжимаются с помощью Git zlib deflate, который в основном похож на gzip, поэтому на этом конкретном уровне это в значительной степени стирка. 1

Если ваши изображения огромны или вы пометили их как "не пытайтесь выполнить дельта-сжатие" с помощью .gitattributes с -delta вы можете предварительно сжать их, т.е. сохранить их как svgz файлы, только для скорости. 2 Если они меньше, и если некоторые svg файл будет дельта-сжатие хорошо против некоторых других svg file, вы, как правило, хотели бы избежать предварительного сжатия их, так как это сделает невозможным Git -сжатие для них.

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


1 Или шесть из одного, полдюжины другого.

2 Даже если время, необходимое Git и другим инструментам для их сжатия, одинаково, отметьте их -delta Git не будет рассматривать их для упаковки, что сохранит git repack время.

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