Как ДЕЙСТВИТЕЛЬНО удалить ветвь git (т.е. Удалить все свои объекты/коммиты)?
У меня есть дерево git, подобное
A---B---C topic
/
D---E---F---G master <--
Я хотел бы удалить тему и все объекты на ней.
Я отмечаю идентификатор SHA для темы, а затем введите:
git branch -D topic
git gc # <-- I also tried prune here...
git checkout -b temp <SHA1 ID of topic>
После последней команды я ожидаю получить ошибку (что-то вроде "несуществующий идентификатор объекта..." или что-то подобное). Однако нет ошибки, и gitk показывает ту же структуру дерева, что и выше?
Что мне не хватает - я думал, что gc/prune должны удалить все недостижимые объекты?
Ответы
Ответ 1
Просто gc чернослива часто недостаточно, чтобы избавиться от лишних объектов в репо. Если в reflog ссылки по-прежнему ссылаются, они не будут считать эти объекты недоступными и, следовательно, зрелыми для обрезки.
Вот что сработало для меня:
git reflog expire --expire=now --all
git gc --aggressive --prune=now
git repack -a -d -l
Это приведет к некоторым изменениям в вашей истории репо и может создать трудности, если другие зависят от ветвей, которые вы удаляете.
Возможно, вам придется повторно клонировать ваш репозиторий, чтобы увидеть разницу в его размере.
Ответ 2
Примечание: май 2010: упомянутый Jakub, если ваша ветка была объединена, тема все равно была бы доступна.
Здесь предположим, что слияния не было.
Затем, как упомянутый в книге ProGit и подробно описанный в этом вопросе fooobar.com/info/2514/...:
git gc --prune=now
должно быть достаточно (вы должны позвонить напрямую git prune
). Вы можете управлять этим с помощью git count-objects -v
.
Редактировать апрель 2012: maxschlepzig в комментариях подтверждает, что могут потребоваться дополнительные шаги, как описано в Duke (но без git repack
).
Поэтому вместо git gc --prune now
:
git reflog expire --expire=now --all
git gc --aggressive --prune=now