Удаление неиспользованных 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 Команда действительно сделать вмятину в уменьшении размера вашего хранилища.

Другие вопросы по тегам