Как конвертировать существующий репозиторий Mercurial для использования субрепозиториев и сохранить историю неповрежденной?

Я читал о субрепозиториях и о том, как извлечь существующую папку из репозитория Mercurial в субрепозитор, используя расширение конвертации и файл. Я могу это сделать. Если у меня есть следующая структура папок:

C:\Project
---Project\root.txt
---Project\SubFolder
---Project\SubFolder\fileinsubfolder.txt

Я могу сделать субрепозитор SubFolder. Точно так же я могу извлечь все остальное из отдельного репозитория (в этом примере во втором репозитории будет только файл root.txt). Впоследствии я могу добавить репозиторий SubFolder в качестве вспомогательного хранилища во второй репозиторий. Но хотя оба хранилища имеют полную историю, эти истории не связаны = > обновление корневого репозитория до более раннего состояния не будет помещать субрепозитор в состояние, в котором он должен находиться в этой точке. Обновление до согласованной старой версии (как root, так и Subrepo обновляется автоматически) будет работать только при обновлении до версии, которая уже знает о субрепозитории и имеет файл .hgsubstate.

И альтернатива, о которой я думал, это просто забыть файлы в SubFolder в текущем репозитории и инициализировать новый репозиторий в SubFolder и в то же время добавить файл .hgsub. То, что я надеюсь достичь здесь, - это работа с этого момента с помощью субрепозитория, но у меня есть способ обновить до более старой версии (до разделения подрепо), потому что файлы SubFolder все еще находятся в истории текущего репозитория.

Это не работает: если я забыл файлы в mercurial, запустил новое репо и связал его как подрепо в текущем репо, и я обновляю до более старой версии до того, как существовал подпорок. Я получаю эту ошибку:

C:\Project>hg update 1
abort: path 'SubFolder\fileinsubfolder.txt' is inside repo 'SubFolder'

Проблема заключается в том, что при обновлении до более старой версии, которая не была осведомлена о подрепоре, это обновление хочет помещать файлы в SubFolder. Но этот SubFolder является еще одним репо (имеет каталог .hg), и хотя в основном репо нет воспоминаний об этом, обновление не хочет помещать файлы в SubFolder, поскольку это репо.

Есть ли способ обойти эту ошибку или есть лучший способ переключиться на использование подрепортажа для определенной папки в существующем хранилище Mercurial и сохранить историю неповрежденной (и обе истории связаны)?

Ответ 1

Нет, я боюсь, что нет инструментов, которые позволят вам разбить репозиторий так, как вы просите.

Чтобы уточнить ваш вопрос, давайте представим себе, что у вас есть репозиторий, где контент root.txt и sub/file.txt развивается следующим образом

   root.txt  sub/file.txt`
0: root 0    file 0
1: root 1    file 1
2: root 2    file 2

для первых трех наборов изменений. То, о чем вы просите, является опцией для hg convert, которая превратит это в два репозитория (легко, мы можем сделать это сегодня) и где расширение конвертирования вставляет файлы .hgsub и .hgsubstate, чтобы три набора изменений содержали

   root.txt  .hgsub     .hgsubstate  |       file.txt
0: root 0    sub = sub  <X> sub      |  <X>: file 0
1: root 1    sub = sub  <Y> sub      |  <Y>: file 1
2: root 2    sub = sub  <Z> sub      |  <Z>: file 2

где хэши <X>, <Y> и <Z> соответствуют тем, которые соответствуют первым трем коммитам в подрепозитории.

Сегодня нет такой опции для hg convert, но на основании вышеизложенного представляется целесообразным написать ее. Это даст вам отличный способ конвертировать назад и вперед между объединенным и разделенным репозиторием.