Как очистить мусор в удаленном 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 ГБ.