Удаление неиспользованных BLOB-объектов с помощью git merge --squash и git gc?
У меня есть хранилище, которое стало очень большим из-за большого количества больших пятен, которые были проверены много лет назад. Они были удалены в последующих ревизиях и больше не нужны, поэтому теперь я могу удалить любую ссылку на них.
Я видел некоторые ссылки на использование git filter-branch
но использование этой команды кажется опасным и грязным, поэтому я попробовал это:
git checkout --orphan new-master
git rm -rf --cached *
git merge --squash master
git branch -D master
git gc --prune=now
Разве это не должно означать, что все, что было создано и впоследствии удалено в любой момент в истории, навсегда отброшено?
По некоторым причинам, это не работает - размер более или менее одинаков.
Какие-либо предложения?
1 ответ
Извините, но filter-branch
это единственный способ сделать это.
Вы должны попробовать проверить это в отдельном клоне вашего хранилища, если вы нервничаете. Просто помните, что git поддерживает все для вас, когда вы делаете это, поэтому ваш клонированный репозиторий будет увеличиваться в размере локально, пока вы не загрузите измененную историю.
Я хотел бы проверить полезную страницу GitHub по этому вопросу.
Кроме того, если вы извините за мой бесстыдный плагин, я недавно работал над гемом Ruby, который предоставляет некоторые основные метрики для больших файлов как в вашей истории, так и в вашей рабочей копии. Он все еще находится в активной разработке, но он работает, и, надеюсь, вы найдете его полезным.
Изменить: почему ваш подход не работает
Прежде всего, git - это распределенная система контроля версий, которая означает, что все ветки и история копируются локально, когда вы выполняете clone
, Следовательно, вы можете сделать git checkout <commit-sha>
для любого коммита в истории репозитория, чтобы получить именно то, на что репозиторий был в некоторый момент в прошлом.
Создание новой ветки не освобождает вас от истории хранилища; на самом деле ветки - это просто указатели на коммиты. Таким образом, чтобы упростить, все ветви имеют общую родословную, поэтому ваши new-master
ветка точно такая же как у тебя старая master
ветка. Небольшое уменьшение в размере, вероятно, было связано с тем, что Git получил немного лучшую оптимизацию от сборки мусора.
Когда ты побежал git gc --prune=now
Вы просто удаляли loose objects
т.е. объекты не в вашем packfile
, packfile
где git эффективно хранит объекты, чтобы повысить эффективность и уменьшить размер вашего хранилища. Вы можете найти больше информации здесь.
Если вы новичок в Git, то это очень важно, но я постарался дать общий обзор. Я бы изучил отличную документацию по git и приготовился git filter-branch
Команда действительно сделать вмятину в уменьшении размера вашего хранилища.