Полностью удалить (старые) git коммиты из истории - PullRequest
26 голосов
/ 14 февраля 2011

Я запускаю проект с использованием git, где я буду фиксировать очень большие файлы, но только несколько раз в неделю.Я пытался использовать git как есть, и кажется, что он сохраняет весь файл в каждом коммите, где он изменяется.Это не будет работать для этого проекта, хранилище выйдет из-под контроля.Итак, я хочу уменьшить размер репозитория.

Моей первой мыслью было «просто» удалить все коммиты старше, чем, скажем, две недели, или оставить только пять коммитов в истории (это, вероятно, лучше:)) Я много гуглил и много читал из Git Community Book, и думаю, мне нужно будет работать с git-rebase или git-filter-branch.Дело в том, что я просто не могу заставить его работать.

Просто для иллюстрации;У меня есть история H только с одной ветвью (Основная ветвь)

A -> B -> C -> D -> E

IЯ хочу удалить некоторые предыдущие коммиты, чтобы моя история выглядела как

C -> D -> E

Коммиты A и B должны быть полностью очищены.Я пробовал git-rebase, но кажется, что слияние коммитов вместе, а не удаление старых, может быть, я не до конца понимаю, как работает rebase ... Еще одна мысль, которая у меня была - удалить все из .git / objects и затем создатьНовый коммит, использующий git-hash-object -w, git-mktree и git-commit-tree, мне пока не удалось отправить это «искусственное» дерево на сервер.

Я не буду работать ни с какими ветвями, поэтому естьнет необходимости принимать это во внимание.

Интересно, может ли кто-нибудь дать мне конкретное употребление git-rebase, если это то, что я должен использовать?Или некоторые другие советы, примеры того, что я могу сделать.

Ура!

Редактировать:

Большие файлы не всегда будут одинаковыми большими файлами, а некоторые файлы будут заменены новыми.Я хочу, чтобы эти замененные файлы были полностью удалены из истории.

1 Ответ

13 голосов
/ 14 февраля 2011

Это должно быть просто git rebase -i, где у вас есть

p A
s B
s C
p D
p E

и затем отредактируйте сообщение фиксации для A-C, чтобы оно было просто сообщением фиксации C.

git-rebase "раздавит" все коммиты в один коммит, чьи объекты такие же, как объекты коммитов С.

Примечание: может быть возможно использовать git filter-branch для изменения больших файлов в предыдущих коммитах, чтобы они действительно соответствовали новым, если вы предпочитаете это делать. Но это опасная операция, и я не хочу давать вам плохую команду при аварии.

...