Как 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
время.