Имеется репозиторий git (примерно 16000 объектов, каталог .git весит 1.2 Гб, хранятся исходники + бинарники 100 Мб и больше). Если выполнить любую из команд
Код:
git fsck
git gc --aggressive
git fast-export master > /dev/null
git verify-pack -v .git/objects/pack/pack-<blablabla>.idx
git unpack-objects < pack-<blablabla>.pack
то git всегда валится с ошибкой
Код:
fatal: Out of memory, malloc failed (tried to allocate 3251404722 bytes).
Я пробовал запускать эти команды на cygwin под Windows XP x86 (2 Гб оперативки, git 1.7.9 из cygwin) и на Debian 7 x86 (2 Гб оперативки, 5 Гб свопа, git 1.7.10.4) - результат одинаковый. Какая-то нелепая ситуация, гит умудряется падать при попытке распаковать репозиторий, который сам создал на той же самой машине. При этом git log и чекаут любого коммита отлично работает. Следующий скрипт последовательно выгружает все коммиты с самого начала, и он работает без ошибок (в репозитории только ветка master):
Код:
for rev in $(git log --format=%h master | tac); do
echo Checking out $rev
git checkout $rev || exit 1
done
Видно, что git fsck пытается выделить блок больше 3 Гб, а в 32-разрядных что в линуксе, что в винде процесс, по-моему, не в состоянии выделить больше 3 Гб памяти, так что я поставил Debian 7 amd64 на виртуалку (770 Мб оперативки, своп 30 Гб) и попробовал запустить на нем, но теперь git убивается OOM-киллером. Выключаю ООМ-киллер:
Код:
sysctl -w vm.overcommit_memory=2
sysctl -w vm.overcommit_ratio=100
Но это тоже не дает эффекта: гит сжирает всю память, только-только начинает лезть в своп, и ООМ-киллер убивает его. Понимаю, что со свопом гит будет работать *очень* долго, но уж хочется довести дело до конца и убедиться, что с репозиторием порядок, а дальше подумаю, как быть.
Есть у кого-нибудь идеи, что тут можно сделать? В первую очередь хотелось бы запустить гит на виртуалке и завершить fsck, ну и другим идеям тоже буду рад.