Как уже упоминалось в , этот ответ SO , git gc
действительно может увеличить размер репо!
См. Также эту тему
Теперь в git есть механизм безопасности, позволяющий не удалять объекты без ссылок сразу при запуске 'git gc
'.
По умолчанию объекты, на которые нет ссылок, хранятся в течение 2 недель. Это сделано для того, чтобы вам было легче восстанавливать случайно удаленные ветви или коммиты, или чтобы избежать гонки, в которой только что созданный объект в процессе, но еще не на который ссылаются, может быть удален процессом 'git gc
', работающим параллельно .
Таким образом, чтобы предоставить этот льготный период упакованным, но не связанным объектам, процесс переупаковки выталкивает эти не связанные объекты из пакета в их свободную форму, чтобы их можно было состарить и в конечном итоге сократить.
Объектов, на которые нет ссылок, обычно не так много. Наличие 404855 объектов без ссылок - довольно много, и отправка этих объектов в первую очередь через клона - это глупость и полная трата пропускной способности сети.
В любом случае ... Чтобы решить вашу проблему, вам просто нужно запустить 'git gc
' с аргументом --prune=now
, чтобы отключить этот льготный период и сразу же избавиться от этих объектов, на которые нет ссылок (безопасно, только если нет других действий git происходят одновременно, что должно быть легко обеспечено на рабочей станции).
И кстати, используя '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