Устранение неполадок при избавлении от больших файлов в репозитории 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 указатель. Затем вам придется обновить все другие ветки и теги для этих вновь созданных коммитов, чтобы полностью удалить багаж из вашего репо.

Другие вопросы по тегам