У меня есть репозиторий, который стал слишком большим до такой степени, что он стал непригодным для использования. В основном мой репозиторий более 2 ГБ и занимает слишком много времени для клонирования. Теперь я хочу сжать его, но все же смогу вернуться к некоторым старым версиям ... Сокращение будет связано с переписыванием истории, поэтому я прекрасно разбираюсь в этом. Люди с клонами должны будут переустанавливать/cherrypick/copyfiles поверх нового филиала в новом клоне репо.Как автоматически сквоить историю хранилища git, без конфликтов, чтобы сжать его?
- У меня есть двоичные файлы в этом репозитории, но они мне нужны (подумайте об этом как обязательном ресурсе для запуска программного обеспечения). Поэтому я не могу использовать фильтр-ветвь или BFG для удаления больших двоичных файлов, так как может понадобиться их при возврате в прошлое.
- Мне не нравятся предыдущие старые/уже объединенные ветки (пример: особенности ветвей), но мне небезразличны некоторые конкретные коммиты (например, главы прошлых релизов)
- Так как я буду модифицировать (~ many ~) очень старые коммиты, я понятия не имею, как правильно решить проблемы с объединением конфликтов (как это может происходить с базовым rebase/cherrypick), поэтому я ищу решение, которое не создает конфликтов, или создает только конфликты, которые могут быть решены автоматически.
- Я хочу сохранить все текущие ветви, поэтому люди, которые работают на клоне, могут переустанавливать/копировать на них.
- Я хочу иметь соответствующую историю между моими новыми коммитами, чтобы соответствовать истории из старого репо (как будто коммиты были раздавлены). История последних ветвей начнется с одного из этих старых раздавленных коммитов.
Я думаю об этом как сквош ненужной старой истории хранилища. То, что я придумал, как возможный процесс для моего дела (я пропустил несколько шагов, и я до сих пор не уверен, что это будет делать то, что я думаю):
- клонировать зеркало существующего репо.
- Создайте сиротские ветви из старых коммитов, которые я хочу сохранить. Это создаст беззастенчивые коммиты со всеми необходимыми в них файлами.
- Как-то связать их, чтобы воссоздать старую историю репо => Как? слияние/переустановка/перезагрузка + фиксация сирот?
- Черрипик каждого списка фиксации текущей ветви (с использованием интервалов) и применения их к последнему фиксации, который раздавил родительский элемент их первого расходящегося сообщения commit => Как автоматически найти, какой фиксации применить чередованный интервал фиксации вишни? Будет ли это работать без конфликтов?
- Переместить теги на новое дерево. Удалите предыдущее дерево. git сбор мусора.
Возможно ли это выполнимо или выполнимо без каких-либо конфликтов? Будет ли это работать в любых случаях (git commit tree может быть довольно сложным)? Любое лучшее решение для безопасного и автоматического сквоша истории?
Мне кажется, что этот тип задачи обслуживания - это то, что произойдет для долгосрочного проекта, поэтому я предполагаю, что другие крупные проекты уже использовали какой-то тип решения. Но я предполагаю, что может быть вариант для git init (или другой команды), о котором я не знаю, для создания нового репо из старого репо для этой утилиты?
Обновление: Я нашел начало решения здесь: https://wincent.com/wiki/Editing,_amending,_or_squashing_the_root_commit_in_a_Git_repository Но я хотел бы сделать это несколько раз в моей истории, полностью автоматическим способом (т.е. без конфликтов) ...
Вы уверены, что это фактически сократит историю? Если у вас есть большие двоичные файлы, шансы - это то, что занимает пространство, а не коммиты. Вы можете сбросить размер блоба для ваших больших объектов и посмотреть, какой процент от 2 ГБ они составляют, что даст вам какие-то улучшения, которых вы могли бы достичь. –
После того, как коммиты раздавлены, двоичные файлы, на которые ссылались в этих фиксациях, больше не будут использоваться и могут быть собраны в мусор ... Я думаю. Спасибо за подсказку размера blob, это может быть полезно проверить. – Asmodehn