У меня есть репозиторий GitHub с двумя ветками - master и release.
Ветвь выпуска содержала двоичные файлы дистрибутива, которые способствовали очень большому размеру репо (> 250 МБ), поэтому я решил все исправить.
Сначала я удалил ветку удаленного выпуска через git push origin :release
Затем я удалил ветку локального выпуска. Сначала я попробовал git branch -d release
, но git сказал: «Ошибка: ветка release не является предком вашей текущей HEAD». что правда, поэтому я сделал, git branch -D release
чтобы принудительно удалить его.
Но размер моего репозитория, как локально, так и на GitHub, по-прежнему был огромным. Итак, я просмотрел обычный список команд git, вроде git gc --prune=today --aggressive
, безуспешно.
Следуя инструкциям Чарльза Бейли в SO 1029969, я смог получить список SHA1 для самых больших блобов. Затем я использовал сценарий из SO 460331, чтобы найти капли ... и пяти самых больших не существует, хотя обнаружены более мелкие капли, поэтому я знаю, что сценарий работает.
Я думаю, что эти блоги - это двоичные файлы из ветки выпуска, и они каким-то образом остались после удаления этой ветки. Как правильно от них избавиться?
Ответы:
... и без лишних слов, могу я представить вам эту полезную команду "git-gc-all", которая гарантированно удалит весь ваш git-мусор, пока не появятся дополнительные переменные конфигурации:
Вам также может потребоваться сначала запустить что-то подобное, о боже, git - это сложно !!
Вам также может потребоваться удалить некоторые теги, спасибо Zitrax:
Я записал все это в скрипт: git-gc-all-ferocious .
источник
objects
. Что это такое и почему они (по-видимому) неактуальны?Как описано здесь , если вы хотите навсегда удалить все, на что ссылается только через reflog , просто используйте
git reflog expire --expire-unreachable=now --all
удаляет все ссылки на недостижимые коммиты вreflog
.git gc --prune=now
удаляет сами коммиты.Внимание : только использование
git gc --prune=now
не будет работать, поскольку эти коммиты все еще упоминаются в рефлоге. Следовательно, очистка рефлога обязательна. Также обратите внимание, что если выrerere
его используете, у него есть дополнительные ссылки, не очищенные этими командами. Подробнееgit help rerere
см. Кроме того, любые коммиты, на которые ссылаются локальные или удаленные ветки или теги, не будут удалены, потому что они считаются ценными данными git.источник
git fetch --prune
еще больше уменьшить размер за счет удаления локальных BLOB-объектов.Как упоминалось в этом SO-ответе ,
git gc
может действительно увеличить размер репо!Также эту ветку
В той же теме упоминается :
Что касается ветки фильтров, вы можете (осторожно) рассмотреть этот сценарий
источник
filter-branch
использования команд.git gc --prune=now
, или низкий уровеньgit prune --expire now
.источник
Каждый раз, когда ваша ГОЛОВА движется, git отслеживает это в файле
reflog
. Если вы удалили коммиты, у вас останутся «болтающиеся коммиты», потому что на них по-прежнему ссылаетсяreflog
~ 30 дней. Это подстраховка при случайном удалении коммитов.Вы можете использовать
git reflog
команду удаления определенных коммитов, переупаковки и т. Д. Или просто команду высокого уровня:источник
Вы можете использовать
git forget-blob
.Использование довольно простое
git forget-blob file-to-forget
. Вы можете получить больше информации здесьhttps://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/
Он исчезнет из всех коммитов в вашей истории, рефлоге, тегах и т. Д.
Время от времени я сталкиваюсь с одной и той же проблемой, и каждый раз, когда мне приходится возвращаться к этому и другим постам, я автоматизировал этот процесс.
Благодарности таких участников, как Сэм Уоткинс
источник
Попробуйте использовать git-filter-branch - он не удаляет большие капли, но может удалить большие файлы, которые вы укажете, из всего репо. Для меня это уменьшает размер репо с сотен МБ до 12 МБ.
источник
Иногда причина того, что «gc» не приносит особой пользы, заключается в том, что существует незаконченная перебазировка или тайник, основанный на старой фиксации.
источник
Чтобы добавить еще один совет, не забудьте использовать git remote prune для удаления устаревших веток ваших пультов перед использованием git gc.
вы можете увидеть их с помощью git branch -a
Это часто бывает полезно, когда вы получаете данные из github и разветвленных репозиториев ...
источник
Прежде чем делать
git filter-branch
иgit gc
, вам следует просмотреть теги, которые присутствуют в вашем репо. Любая реальная система, которая имеет автоматические теги для таких вещей, как непрерывная интеграция и развертывание, будет делать нежелательные объекты, на которые ссылаются эти теги, поэтомуgc
не может их удалить, и вы все равно будете задаваться вопросом, почему размер репо по-прежнему так велик.Лучший способ избавиться от всего нежелательного - запустить
git-filter
&,git gc
а затем переместить мастер в новое голое репо. Новое чистое репо будет иметь очищенное дерево.источник