Ну ... ты здесь упускаешь большую часть проблемы, но я вернусь к тому. Чтобы ответить на ваш вопрос, как задано:
Из опций, которые вы пробовали, filter-branch
- это тот, который должен был сработать. (Имейте в виду, что git имеет новый инструмент, filter-repo
, который они рекомендуют более filter-branch
; но я не потратил время на переключение, и похоже, что у вас есть почти работающая процедура filter-branch
в любом случае, поэтому я отвечу на ответ, используя filter-branch
...)
Итак, вы говорите, что вы можете восстановить удаленные файлы после использования filter-branch
с index-filter
. Для этого есть несколько возможных причин, но, как правило, смысл в том, что git пытается избежать потери данных, если не уверен, что они вам больше не нужны. Итак:
filter-branch
создает набор «резервных ссылок» всякий раз, когда переписывает ссылки репо. Эти «резервные ссылки» все еще могут доходить до старой истории - . Перефлоги для ваших веток обеспечивают способ go вернуться туда, куда ранее указывали эти ветви; эти исторические записи рефлогов все еще могут доходить до старой истории
Самый простой способ избавиться от всего этого - отойти из репо, где вы проводили очистку. Если вы действительно хотите очистить его на месте, вам необходимо (1) удалить ссылки в пространстве имен original
; (2) истечь или удалить reflogs - у меня всегда были проблемы с получением git, чтобы истечь их, но если все остальное терпит неудачу rm -r .git/logs
; (3) запустить г c. Для этого типа операций я использую gc --force --aggressive --prune=now
.
Теперь ... большая проблема, если история 11 проектов вместе составляет 14,3 ГБ, то история каждого проекта (в среднем) превышает 1 ГБ - и это все еще смешно. У вас есть более глубокая проблема. Разделение репозиториев, IMO, хорошая идея (я не фанат тренда "monorepo"); но вы также должны пытаться уменьшить общий размер репо.
Скорее всего, у вас есть большие двоичные файлы под контролем исходного кода. Очень редко это рекомендуется. Если вам нужно это сделать, вы должны использовать инструмент, такой как git lfs
, чтобы сделать репо ядра небольшим и управляемым. Но если вы просто храните артефакты сборки, или зависимости, или что-то в этом роде, вам лучше будет заглянуть в хранилище артефактов (artifactory, nexus, ...). Для этого может потребоваться улучшенный инструментарий сборки для управления версиями зависимостей