Как преобразовать существующий репозиторий Mercurial в субпозитории и сохранить историю в неизменном виде? - PullRequest
10 голосов
/ 05 января 2011

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

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

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

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

Это не работает, хотя: когда я забыл файлы в Mercurial, запустил новый репо и связал его как подпредставление в текущем репо, и я обновляюсь до более ранней версии до того, как подпрет существовал, я получаю эту ошибку: 1008 *

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

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

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

1 Ответ

4 голосов
/ 06 января 2011

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

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

...