Есть ли способ в mercurial для удаления старых наборов изменений из базы данных? У меня есть хранилище, которое составляет 60 ГБ, и это делает его довольно болезненным для создания клона. Я хотел бы отрезать все до определенной даты и отложить огромную базу данных для сбора пыли.
Mercurial Удалить историю
Ответ 1
Вы можете сделать это, но при этом вы лишаете законной силы все клоны, поэтому обычно не стоит этого делать, если вы не работаете в одиночку.
Каждый набор изменений в Mercurial уникально идентифицируется с помощью хэш-кода, который представляет собой комбинацию (среди прочего) изменений исходного кода, метаданных и хэшей одного или двух родителей. Эти родители должны существовать в репо до самого начала проекта. (Отсутствие этого ограничения будет иметь мелкие клоны, которые недоступны (пока)).
Если у вас все в порядке с изменением хэшей более новых наборов изменений (которые снова разбивают все клоны в дикой природе), вы можете сделать это с помощью команд;
hg export -o 'changeset-%r.patch' 400:tip # changesets 400 through the end for example
cd /elsewhere
hg init newrepo
cd newrepo
hg import /path/to/the/patches/*.patch
Вам, вероятно, придется проделать небольшую работу для обработки наборов изменений слиянием, но это общая идея.
Можно также сделать это, используя hg convert
с типом hg
как в качестве исходного, так и в качестве целевого типов, и используя splicemap
, но это, вероятно, еще более splicemap
.
Большой вопрос в том, как набрать 60 ГБ исходного кода или вы добавляете сгенерированные файлы вопреки всем советам. :)
Ответ 2
Нет простого/рекомендуемого способа сделать это непосредственно в существующем репозитории.
Однако вы можете "преобразовать" свое меркурийное репо в новое ртутное репо и выбрать версию, из которой можно включить историю с помощью опции convert.hg.startrev
hg convert --config convert.hg.startrev=1234 <source-repository> <new-repository-name>
Новое репо будет содержать все, начиная с исходного репо минус история, предшествующая исходной версии.
Предостережение: Новое репо будет иметь полностью новые идентификаторы набора изменений, т.е. он никоим образом не связан с исходным репо. После создания нового репо каждый разработчик должен клонировать новое репо и удалять свои клоны из исходного репо.
Я использовал это для очистки старых репозиториев, используемых внутри нашей компании, в сочетании с опцией --filemap для удаления ненужных файлов.