Ответы:
Объект (BLOB, деревья и коммиты) с SHA скажем - 810cae53e0f622d6804f063c04a83dbc3a11b7ca будет храниться в
.git/objects/81/0cae53e0f622d6804f063c04a83dbc3a11b7ca
(разделение на первые два символа для повышения производительности файловой системы, поскольку теперь не все объекты хранятся в одном каталоге)
Объекты, хранящиеся как указано выше, называются свободными объектами.
Когда вы запускаете репо, у вас есть в основном свободные объекты. Когда число увеличивается, оно становится неэффективным, и они сохраняются в файле пакета. Такие объекты называются упакованными объектами.
git gc
это то, что вы запускаете, чтобы упаковать объекты (Обычно свободные объекты, которые не нужны и несколько недель назад, также удаляются, и с --prune=<date>опцией вы можете принудительно удалить свободные объекты, которые больше не нужны. Например, когда вы изменяете коммит. Старый объект фиксации не больше не нужно.)
--pruneопция включена по умолчанию, и, поскольку git gcона запускается автоматически при обычном использовании (например commit), вам обычно не нужно беспокоиться об этом. Я не использую git gui и не могу точно определить, где он запущен в источнике, но он либо выполняет свою собственную проверку, либо просто перехватывает gcсрабатывание вызываемой команды. Это, конечно, не о чем беспокоиться, просто вызвано нормальным использованием.
git gcвручную? Я думаю, что это должно улучшиться, потому что потерянные объекты неэффективны, а 50 000 - это очень большое число. Я также обнаружил, что упаковка значительно уменьшает пространство, используемое .gitпапкой.
Книга Git объясняет это довольно хорошо: https://git-scm.com/book/en/v2/Git-Internals-Packfiles
Свободные объекты - более простой формат. Это просто сжатые данные, хранящиеся в одном файле на диске. Каждый объект записан в отдельный файл.
git gcдля вас, с хорошим индикатором выполнения GUI (хотя в большинстве случаев он отображается как застрявший).