Как ДЕЙСТВИТЕЛЬНО удалить ветку git (т.е. удалить все ее объекты / коммиты)? - PullRequest
23 голосов
/ 21 мая 2010

У меня есть мерзавец, как

                 A---B---C topic
                /
           D---E---F---G master     <--

Я хотел бы удалить тему и все объекты на ней.

Я отмечаю SHA ID темы, затем набираю:

git branch -D topic
git gc                                   #  <-- I also tried prune here...
git checkout -b temp <SHA1 ID of topic>

После последней команды я ожидаю получить сообщение об ошибке (что-то вроде «ID несуществующего объекта ...» или что-то в этом роде). Однако ошибки нет, и gitk показывает ту же структуру дерева, что и выше.

Чего мне не хватает - я думал, что gc / prune должен удалить все недоступные объекты?

Ответы [ 2 ]

24 голосов
/ 16 декабря 2010

Просто gc prune часто недостаточно, чтобы избавиться от лишних объектов в репо. Если в reflog по-прежнему есть ссылки на коммиты, эти объекты не будут считаться недоступными и, следовательно, готовыми к удалению.

Вот что у меня сработало:

git reflog expire --expire=now --all
git gc --aggressive --prune=now
git repack -a -d -l

Это внесет некоторые изменения в историю вашего репо и может создать трудности, если другие зависят от веток, которые вы ударили.

Возможно, вам придется повторно клонировать ваш репозиторий, чтобы увидеть разницу в его размере.

6 голосов
/ 21 мая 2010

Примечание, май 2010: как упомянуто Jakub , если ваша ветвь будет объединена, тема все равно будет доступна.

Здесь, давайте предположим, что слияния не было.
Затем, как указано , упомянутое в книге ProGit и подробно изложенное в этом ТАК вопрос :

git gc --prune=now

должно быть достаточно (вам следует позвонить напрямую git prune). Вы можете контролировать это с помощью git count-objects -v.
Изменить апрель 2012 года: maxschlepzig в комментариях подтверждает, что могут потребоваться дополнительные шаги, как подробно описано в Duke answer (но без git repack).
Так что вместо git gc --prune now:

git reflog expire --expire=now --all
git gc --aggressive --prune=now
...