#Что означает проблема
После переписывания истории Git старые объекты не обязательно исчезают физически сразу: их могут удерживать ссылки, журналы reflog, резервные или скрытые ветки и pack-файлы до обслуживания. Размер локальной папки .git и размер репозитория на сервере меняются независимо. В статье предполагается, что история уже очищена по отдельному согласованному плану; если файл удалён только обычным коммитом, он всё ещё есть в старой истории и этот случай следует сначала отличить.
#Как отличить причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Файл всё ещё есть в достижимой историиПереписаны не все ветки или метки, либо файл удалён только из последнего состояния. | Поиск по всем ссылкам git log --all -- путь по-прежнему находит старый коммит. | Уточнить, какие ссылки удерживают старую историю; повторная миграция только с участниками проекта. |
| Историю уже переписали, но остались старые объектыЗаписи reflog или упакованные пока недостижимые объекты ещё могут занимать место. | Поиск файла в обычной истории пуст, но git count-objects -vH показывает существенный объём size-pack. | Разобрать локальные журналы и срок хранения; без спешки дождаться согласованного обслуживания. |
| Размер сравнивают в разных местахНовая история в одной копии не приводит к автоматическому уменьшению старого клона или сервера. | Свежий независимый клон заметно меньше локальной рабочей папки либо сервер продолжает хранить старые ссылки. | Снять отдельно размеры каждой копии и проверить политику хостинга. |
| Большое место занимают не объекты историиВнутри рабочей папки сохранились бинарные сборки, кэш или неотслеживаемые файлы. | Размер .git меньше ожидаемого, но весь каталог проекта остаётся большим. | Проверить объём .git отдельно от рабочей папки, не удаляя файлы. |
#Пошаговая диагностика и решение
- Проверьте, какой репозиторий и какой размер вы сравниваетеОткройте проект в VS Code («Файл» → «Открыть папку»), затем «Терминал» → «Создать терминал». Выполните
git --version,git rev-parse --show-toplevelиgit status -sb. Запишите путь и версию. В файловом менеджере посмотрите размер скрытого каталога.gitотдельно от всего проекта. Для bare-репозитория на сервере каталога рабочего дерева может не быть; не путайте его с локальным клоном. - Убедитесь, что история действительно очищенаВ терминале выполните
git log --all --oneline -- путь/к/удалённому/файлу, подставив известный прежний путь. Если выводит коммиты, файл всё ещё находится в истории одной из известных веток или меток: сначала выясните какую ссылку забыли при миграции. Если вывода нет, не считайте вопрос окончательно решённым: файл мог иметь другое имя. При обнаружении секретов немедленно отзовите ключи/пароли, не надеясь на очистку истории. - Снимите показатели хранилища Git без очисткиВыполните
git count-objects -vH. В строкеsize-packуказан суммарный размер упакованных объектов в единицах для чтения, аsizeотносится к свободным объектам. Сохраните этот результат до дальнейшей диагностики и не используйтеgit gc --prune=now: он может преждевременно удалить коммиты, которые ещё требуются для восстановления. - Проверьте оставшиеся ссылки и журналыКоманды
git for-each-ref --format="%(refname)"иgit reflog --all --date=isoтолько показывают локальные ссылки и журнал их перемещений. Обратите внимание на резервные ссылки, старые ветки, временные refs и записи до операции переписывания. Не удаляйте их по названию: часть могла быть создана программой или политикой резервирования. - Проверьте недостижимые объекты только при достаточных ресурсахЕсли репозиторий очень большой, согласуйте длительную проверку с администратором. Затем на копии или в подходящее окно обслуживания используйте
git fsck --full --no-reflogs --unreachable: это диагностический просмотр объектов, на которые не ссылаются обычные ссылки при игнорировании журналов reflog. Наличие строкunreachable blobилиunreachable commitне означает, что их можно безопасно удалить: среди них могут быть единственные копии работы. - Сравните со свежим клоном и удалённым серверомЕсли есть доступ и достаточно свободного места, создайте новый независимый клон в другой папке штатной кнопкой «Клонировать репозиторий» в VS Code либо обычной командой
git cloneпо проверенному адресу. Не заменяйте исходный клон. Если новый клон мал, а прежний велик, проблема, вероятно, в оставшихся локальных объектах. Если оба велики, проверьте серверные ветки/метки и политики хранения с администратором. - Обсудите обслуживание с владельцами до удаления объектовПеред любыми операциями по освобождению места убедитесь, что резервная копия
.gitсоздана и действительно содержит нужные прежние коммиты, а у участников нет незавершённой работы с этими ссылками. На серверных платформах очистка старых объектов может выполняться собственными средствами и по расписанию. Запросите процедуру у администратора; в этой инструкции нет команд ускоренного удаления reflog или немедленного удаления недостижимых объектов. - После согласованного обслуживания сравните цифры повторноПовторно выполните
git count-objects -vHи измерьте размер.git, а затем отдельно проверьте размер на сервере и нового клона. Если новая история не содержит файл и размеры снизились там, где ожидалось, задача выполнена. Если локальное место не освободилось, сохраните показатели до/после и выведите список refs для специалиста, не выполняя повторную очистку вслепую.
#Команды для проверки и исправления
-vH показывает статистику объектов в удобных единицах, команды ничего не удаляют.git --versiongit rev-parse --show-toplevelgit status -sbgit count-objects -vH--all просматривает известные ветки и метки, -- отделяет путь.git log --all --oneline -- путь/к/удалённому/файлуgit for-each-ref --format="%(refname)"git reflog --all --date=iso--no-reflogs игнорирует reflog при определении достижимости. Результат не является разрешением на удаление объектов.git fsck --full --no-reflogs --unreachable#Как проверить результат и что делать, если не помогло
Проверка проводится по трём независимым признакам: старый файл не виден в необходимой истории, новая копия имеет ожидаемый размер, а размер локального или серверного хранилища после согласованного обслуживания уменьшился. Если эти результаты расходятся, сохраните git count-objects -vH, имена оставшихся ссылок и сведения о месте измерения, затем передайте их администратору. Не пытайтесь сократить папку .git ручным удалением pack-файлов.