Как упоминалось в этом SO-ответе , git gc
может действительно увеличить размер репо!
Также эту ветку
Теперь у git есть механизм безопасности, чтобы не удалять объекты, на которые нет ссылок, сразу при запуске ' git gc
'.
По умолчанию объекты, на которые нет ссылок, хранятся в течение 2 недель. Это сделано для того, чтобы упростить восстановление случайно удаленных ветвей или коммитов или избежать гонки, когда только что созданный объект, находящийся в процессе, но еще не упомянутый, может быть удален git gc
параллельным процессом.
Таким образом, чтобы дать этот льготный период упакованным, но не имеющим ссылки объектам, процесс переупаковки выталкивает эти объекты без ссылок из упаковки в их свободную форму, чтобы их можно было выдержать и в конечном итоге обрезать.
Однако объектов, на которые нет ссылок, обычно не так много. Наличие 404855 объектов, на которые нет ссылок, - это довольно много, и отправка этих объектов в первую очередь через клон - это глупо и полная трата пропускной способности сети.
В любом случае ... Чтобы решить вашу проблему, вам просто нужно запустить ' git gc
' с --prune=now
аргументом, чтобы отключить этот льготный период и сразу же избавиться от тех объектов, на которые нет ссылок (безопасно, только если в то же время не выполняются другие действия git, которые должны быть легко обеспеченным на рабочей станции).
И BTW, используя ' git gc --aggressive
' с более поздней версией git (или ' git repack -a -f -d --window=250 --depth=250
')
В той же теме упоминается :
git config pack.deltaCacheSize 1
Это ограничивает размер дельта-кеша одним байтом (фактически отключая его) вместо значения по умолчанию 0, что означает неограниченный. Благодаря этому я могу перепаковать этот репозиторий, используя указанную выше git repack
команду в системе x86-64 с 4 ГБ ОЗУ и с использованием 4 потоков (это четырехъядерный процессор). Однако использование резидентной памяти увеличивается почти до 3,3 ГБ.
Если ваш компьютер SMP и у вас недостаточно оперативной памяти, вы можете уменьшить количество потоков до одного:
git config pack.threads 1
Кроме того, вы можете дополнительно ограничить использование памяти с помощью --window-memory argument
" git repack
".
Например, использование --window-memory=128M
должно сохранять разумную верхнюю границу использования памяти для дельта-поиска, хотя это может привести к менее оптимальному дельта-совпадению, если репо содержит много больших файлов.
Что касается ветки фильтров, вы можете (осторожно) рассмотреть этот сценарий
#!/bin/bash
set -o errexit
# Author: David Underhill
# Script to permanently delete files/folders from your git repository. To use
# it, cd to your repository's root and then run the script with a list of paths
# you want to delete, e.g., git-delete-history path1 path2
if [ $# -eq 0 ]; then
exit 0
fi
# make sure we're at the root of git repo
if [ ! -d .git ]; then
echo "Error: must run this script from the root of a git repository"
exit 1
fi
# remove all paths passed as arguments from the history of the repo
files=$@
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $files" HEAD
# remove the temporary history git-filter-branch otherwise leaves behind for a long time
rm -rf .git/refs/original/ && git reflog expire --all && git gc --aggressive --prune