Устранение неполадок при избавлении от больших файлов в репозитории git на GitHub
У меня есть проект под названием geoplot
что делает геопространственное построение в Python. Код для этого распространяется через git
на GitHub. Вы можете проверить это здесь.
В рамках процесса разработки этого пакета я загрузил и сохранил в geoplot
репо в папку с именем data/
который содержал большое количество файлов данных в различных форматах. Эти файлы данных были использованы для заполнения примеров в галерее бесплатных примеров.
Однако эти файлы увеличивают общий размер хранилища до ~150 МБ ( проблема). Это явно слишком много, и мне пора от них избавиться.
Проблема в том, что мне нужно не просто удалить эти файлы из текущего HEAD
Я также вычистил эти файлы из всего git
история. Я попробовал ручной подход, используя git rebase
это не сработало. Тогда я попробовал BFG Repo-Cleaner
инструмент, как рекомендовано в каноническом вопросе SO по этому вопросу.
BFG избавили меня от файлов, они больше нигде в истории не существуют. Тем не менее, размер репо (как видно при запуске https://github.com/ResidentMario/geoplot.git
) вообще не спускался!
Вот что я попробовал (за исключением распечаток):
java -jar ../bfg-1.12.15.jar --delete-folders "data" .
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push --set-upstream https://github.com/ResidentMario/geoplot.git master --force
Полная распечатка находится в выпуске на GitHub.
Что, если что, я сделал не так? Как мне диагностировать источник и удалить это потраченное впустую пространство?
2 ответа
Я упомянул reflog
а также gc
еще в 2010 году, но также удаляя старые объекты.
(Заметка: gc
должно сопровождаться repack
)
Во-первых, проверьте, если при повторном клонировании репо у вас останется тот же размер.
Как отмечает в комментариях Aleksey Bilogur:
вам нужно убедиться, что ваш тег не ссылается на старые данные, а затем вам нужно принудительно нажать все теги и ветви (не только
master
)git push --tags origin --force
Сгенерированные данные должны быть удалены из истории репо.
Это звучит как проблема, которую можно решить без внешних инструментов, используя filter-branch
,
Если вы хотите удалить всю историю data
каталог, вы можете запустить следующее из корня вашего репо.
git filter-branch --index-filter 'git rm --cached --ignore-unmatch -r path/to/data' HEAD
Это изменит каждый коммит в предке вашего текущего HEAD
указатель. Затем вам придется обновить все другие ветки и теги для этих вновь созданных коммитов, чтобы полностью удалить багаж из вашего репо.