Как конвертировать существующий репозиторий 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
, но на основании вышеизложенного представляется целесообразным написать ее. Это даст вам отличный способ конвертировать назад и вперед между объединенным и разделенным репозиторием.