git gc
уже выполняет git repack
, поэтому нет смысла переупаковывать вручную, если вы не собираетесь передавать ему какие-то специальные опции.
Первый шаг - выяснить, является ли большая часть пространства (как это обычно бывает) базой данных вашего объекта.
git count-objects -v
Это должно дать отчет о том, сколько распакованных объектов имеется в вашем хранилище, сколько места они занимают, сколько у вас файлов пакета и сколько места они занимают.
В идеале, после перепаковки у вас не должно быть распакованных объектов и одного файла пакета, но вполне нормально, что некоторые объекты, на которые нет прямой ссылки из текущих веток, все еще присутствуют и распаковываются.
Если у вас есть одна большая упаковка, и вы хотите знать, что занимает место, вы можете перечислить объекты, которые составляют пакет, вместе с тем, как они хранятся.
git verify-pack -v .git/objects/pack/pack-*.idx
Обратите внимание, что verify-pack
принимает индексный файл, а не сам файл пакета. Это дает отчет о каждом объекте в пакете, его истинном размере и упакованном размере, а также информацию о том, был ли он «разграничен» и, если это так, происхождение дельта-цепи.
Чтобы увидеть, есть ли какие-либо необычно большие объекты в вашем хранилище, вы можете отсортировать результаты численно по третьему четвертому столбцу (например, | sort -k3n
).
Из этого вывода вы сможете увидеть содержимое любого объекта с помощью команды git show
, хотя невозможно точно определить, где в истории фиксации хранилища ссылается на объект. Если вам нужно сделать это, попробуйте что-нибудь из этого вопроса .