Что такое "несвязанные объекты" в git и как с ними бороться если нужно?
Что такое "несвязанные объекты" в git? Нужны ли они, или их нужно удалять? И как это делать? В интернете ничего про них не нашел.
Обнаружил их в статистике базы данных git.
Ответы (1 шт):
В git каждый файл, комит, связь и т.п. по-умолчанию хранится в отдельном файле на диске, с хешем в качестве имени. Их можно обнаружить в папке .git/objects, например .git/objects/a1/55eb4229851634a0f03eb265b69f5a2d56f341. При этом первые две цифры хеша используются для формирования имени папки - это костыль, направленный на избежание излишнего деградированния производительности файловой системы, возникающей, когда в одной папке находится очень много файлов. Эти отдельные файлы и называются несвязанными объектами (loose objects). При внесении любого изменения в файл при комите для него будет создаваться новый несвязанный объект, в который целиком копируется содержимое этого файла. Очевидно, что даже с учетом сжатия такая системы хранения будет крайне неэффективна. Соответственно на этот случае в гите предусмотрен другой костыль - альтернативный, более эффективный, формат хранения (pack файлы). При выполнении git gc git будет проводить анализ содержимого loose objects, а затем формировать pack файлы сохраняя в каждом некоторый базовый loose object как есть, и пачку похожих loose object в виде разницы с базовым, заменяя отдельные loose object и экономя место.
