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

Mercurial Удалить историю

Есть ли способ в mercurial для удаления старых наборов изменений из базы данных? У меня есть хранилище, которое составляет 60 ГБ, и это делает его довольно болезненным для создания клона. Я хотел бы отрезать все до определенной даты и отложить огромную базу данных для сбора пыли.

4b9b3361

Ответ 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 для удаления ненужных файлов.