Как очистить мусор в удаленном git repo
недавно я столкнулся с ограничением размера с моим РЕПО Bitbucket. Я следил за бесчисленными другими вопросами, отвечая, как очистить ваше git-РЕПО, и в конечном итоге использовал BFG для удаления некоторых плохих коммитов.
это сработало отлично, однако я заметил, что после запуска подсчета git в мусоре было много места. Поэтому я запустил простой git gc. Однако это не помогло убрать мусор.
после некоторого копания я нашел следующее команда:
git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0
-c gc.rerereunresolved=0 -c gc.pruneExpire=now gc "$@"
запуск этого привел к очистке мусора локально. Тем не менее, у меня все еще есть проблема удаленного РЕПО. Теперь мне нужно заставить Bitbucket запустить эту команду на моем удаленном репозитории, или есть способ переместить это изменение в репозиторий?
2 ответов
мы думаем, что у нас была такая же проблема сегодня и мы смогли ее решить без контакта с поддержкой Bitbucket, как показано ниже. Обратите внимание, что метод отбрасывает последнюю фиксацию из РЕПО - вы, наверное, хотите иметь его резервную копию.
Bitbucket сообщил, что наше РЕПО было около 2.1 GB, в то время как при клонировании он занял только около 250MB локально. Исходя из этого, мы пришли к выводу, что это скорее всего из больших файлов в недоступных совершает (спасибо этот ответ).
вот как увидеть недостижимые коммиты локально, где мы не учитываем достижимость через reflog:
git fsck --unreachable --no-reflog
локально, недостижимые коммиты могут быть очищены с помощью:
git reflog expire --expire-unreachable="now" --all
git prune --expire="now" -v
git gc --aggressive --prune="now"
мы не можем, однако, запустить любую из этих команд удаленно на Bitbucket. Но, говорят на страница об уменьшении размера РЕПО (раздел удалить ограничение хранилища), что они работают git gc
сами в ответ на делаем git reset --hard HEAD~1
(где отбрасывает последний коммит), затем git push -f
. Также, говорят в разделе мусор сбора мертвых данных что можно попробовать последовательность: git reflog expire --expire=now --all
, git gc --prune=now
, git push --all --force
. Учитывая все это, я решил попробовать следующее локально, надеясь, что он вырезает рефлог и сделает чернослив локально, а затем отправит их в удаленный репозиторий Bitbucket, на котором он запустит gc:
git reflog expire --expire-unreachable="30m" --all
git prune --expire="30m" -v
git gc --prune="30m"
git reset --hard HEAD~1
git push -f
это сработало, размер РЕПО сразу пошел от 2.1 Гб в ca. 250МБ. :)
обратите внимание, что парам времени истекает / истекает-недостижимый / чернослив устанавливает точку отсечения истечения, измеряющую отныне назад. Так, например, " сейчас "означает истекать / обрезать все, а" 30m " означает, за исключением изменений за последние 30 минут.
Если кто-то переживает это, ответ оказался "да".
поддержка Bitbucket выполнила следующее:
bash-4.1$ git reflog expire --expire="1 hour" --all
bash-4.1$ git reflog expire --expire-unreachable="1 hour" --all
bash-4.1$ git prune --expire="1 hour" -v
bash-4.1$ git gc --aggressive --prune="1 hour"
до и после уменьшили размер удаленного РЕПО с более чем 2 ГБ до менее 1 ГБ.