Как ДЕЙСТВИТЕЛЬНО удалить ветвь 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