Подтвердить что ты не робот

Полностью удалить (старый) git фиксируется из истории

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

Моя первая мысль заключалась в том, чтобы "просто" удалить все коммиты старше, чем две недели, или только сохранить, например. пять коммитов в истории (это, наверное, лучше:)) Я много раз искал и читал много из "Сообщество" git, и мне кажется, мне нужно работать с git-rebase или git-filter-branch. Дело в том, что я просто не могу заставить его работать.

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

A → B → C → D → E

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

C → D → E

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

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

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

Ура!


Edit:

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

4b9b3361

Ответ 1

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

p A
s B
s C
p D
p E

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

git -rebase будет "выдавливать" все коммиты в единую фиксацию, объекты которой совпадают с объектами commit C.

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