К каким «незакрепленным объектам» относится графический интерфейс Git?

219

Когда я открываю Git GUI , я получаю всплывающее сообщение, которое ссылается на loose objects. Я сделал, git gcи это удалило сообщение.

Что loose objectsи как я могу предотвратить, чтобы это не повторилось?

оксо
источник
Вы можете просто нажать «Да» во всплывающем сообщении, когда он спросит, нужно ли упаковывать свободные объекты сейчас. Git GUI будет работать git gcдля вас, с хорошим индикатором выполнения GUI (хотя в большинстве случаев он отображается как застрявший).
ADTC

Ответы:

144

Объект (BLOB, деревья и коммиты) с SHA скажем - 810cae53e0f622d6804f063c04a83dbc3a11b7ca будет храниться в

.git/objects/81/0cae53e0f622d6804f063c04a83dbc3a11b7ca

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

Объекты, хранящиеся как указано выше, называются свободными объектами.

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

 git gc

это то, что вы запускаете, чтобы упаковать объекты (Обычно свободные объекты, которые не нужны и несколько недель назад, также удаляются, и с --prune=<date>опцией вы можете принудительно удалить свободные объекты, которые больше не нужны. Например, когда вы изменяете коммит. Старый объект фиксации не больше не нужно.)

manojlds
источник
3
Эта --pruneопция включена по умолчанию, и, поскольку git gcона запускается автоматически при обычном использовании (например commit), вам обычно не нужно беспокоиться об этом. Я не использую git gui и не могу точно определить, где он запущен в источнике, но он либо выполняет свою собственную проверку, либо просто перехватывает gcсрабатывание вызываемой команды. Это, конечно, не о чем беспокоиться, просто вызвано нормальным использованием.
Каскабель
21
есть ли какие-то недостатки упаковки сыпучих предметов? Если нет, то почему Git не делает это автоматически?
Луис Рис
13
Я не думаю, что это правда, что это происходит автоматически. Я часто совершаю коммиты, но в упомянутом «git gui» было 50000 незакрепленных объектов (и мне было интересно, почему git был таким чертовски медленным, большой проект за ~ 4 года без ручного gc)
Кевин
1
@Kevin Повысилась ли производительность вашего крупного проекта после запуска git gcвручную? Я думаю, что это должно улучшиться, потому что потерянные объекты неэффективны, а 50 000 - это очень большое число. Я также обнаружил, что упаковка значительно уменьшает пространство, используемое .gitпапкой.
ADTC
3
@LouisRhys, «Когда объекты записываются на диск, он часто находится в свободном формате, так как доступ к этому формату менее затратный. Однако, в конечном итоге вы захотите сэкономить место за счет упаковки объектов» - из Git Book ссылка в ответе ниже
Крис
39

Книга Git объясняет это довольно хорошо: https://git-scm.com/book/en/v2/Git-Internals-Packfiles

Свободные объекты - более простой формат. Это просто сжатые данные, хранящиеся в одном файле на диске. Каждый объект записан в отдельный файл.

Мохамед Мансур
источник