Подтвердить что ты не робот

Как очистить мусор в удаленном репозитории git

Недавно я столкнулся с лимитом размера с моим ретуботом 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 "[email protected]"

Выполнение этого привело к очистке мусора локально. Тем не менее, у меня все еще есть проблема удаленного репо. Должен ли я теперь заставить Bitbucket запускать эту команду на моем удаленном репо или есть способ переместить это изменение в репозиторий?

4b9b3361

Ответ 1

Если кто-то еще испытывает это, ответ оказался положительным.

Поддержка Bitbucket выполнялась следующим образом:

git reflog expire --expire="1 hour" --all
git reflog expire --expire-unreachable="1 hour" --all
git prune --expire="1 hour" -v
git gc --aggressive --prune="1 hour"

До и после размер удаленного репо уменьшился с 2 ГБ до 1 ГБ.

Ответ 2

Мы думаем, что сегодня у нас была такая же проблема, и мы смогли решить ее без обращения к поддержке Bitbucket, как показано ниже. Обратите внимание, что метод отбрасывает последнюю фиксацию из репо, поэтому вы, вероятно, захотите создать резервную копию.

Bitbucket сообщил, что наше репо было около 2,1 ГБ, а при клонировании оно заняло около 250 МБ локально. Из этого мы пришли к выводу, что это скорее всего из больших файлов в недостижимых коммитах (благодаря этому ответу).

Вот как можно видеть недостижимые коммиты локально, где мы не учитываем достижимость через 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. Учитывая все это, я решил попробовать следующее локально, надеясь, что он вырезает reflog и сделает снимок локально, а затем вытолкнет их в удаленный репозиторий 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 ГБ до ок. 250MB.:)

Обратите внимание, что временной параметр, который истекает /expire -unreachable/prune, теперь устанавливает значение точки отсечки истечения. Так, например, "now" означает expire/trune all, а "30m" означает, за исключением изменений за последние 30 минут.