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

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

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

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

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

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

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

Проблема здесь в том, что при обновлении до более старой версии, которая не знала о вложенном репо, это обновление хочет поместить файлы в вложенную папку. Но эта подпапка по-прежнему является еще одним репо (имеет каталог .hg), и хотя в основном репозитории об этом ничего не известно, обновление не хочет помещать файлы в подпапку, поскольку это репо. Этот вопрос касается небольшого расхождения в поведении VB.NET и C #. Если вы фанат языка, который не может дать ответ, кроме «вот почему вам следует использовать C #, noob» , вам здесь не на что смотреть; пожалуйста, продолжайте.

В частности, я ожидал поведения, описанного в Спецификации языка C # (курсив добавлен):

Когда конструктор экземпляра не имеет инициализатора конструктора или имеет инициализатор конструктора для form base (...) , этот конструктор неявно выполняет инициализации, указанные инициализаторами переменных для полей экземпляра, объявленных в его классе. Это соответствует последовательности присвоений, которые выполняются сразу после входа в конструктор и перед неявным вызовом прямого конструктора базового класса. Инициализаторы переменных выполняются в текстовом порядке, в котором они появляются в объявлении класса.

Сравните это с частью Спецификации языка VB.NET, касающейся Конструкторов экземпляров , в которой говорится (выделение добавлено):

Когда первая инструкция конструктора имеет форму MyBase.New (...) , конструктор неявно выполняет инициализации, указанные в инициализаторах переменных экземпляров переменных, объявленных в типе. Это соответствует последовательности присвоений, которые выполняются сразу после вызова прямого конструктора базового типа. Такой порядок гарантирует, что все переменные базового экземпляра инициализируются их инициализаторами переменных перед выполнением любых операторов, имеющих доступ к экземпляру.

Несоответствие здесь сразу очевидно. C # инициализирует переменные уровня класса перед вызовом базового конструктора. VB.NET делает прямо противоположное, очевидно предпочитая вызывать базовый конструктор перед , устанавливающим значения полей экземпляра.

Если вы хотите увидеть какой-то код, этот связанный вопрос предоставляет более конкретный пример расходящегося поведения. К сожалению, он не дает никаких намеков на то, как можно заставить VB.NET следовать модели, установленной C #.

I ' Меня меньше интересует, почему разработчики двух языков выбрали такие разные подходы, чем возможные пути решения этой проблемы. В конечном счете, мой вопрос таков: Есть ли способ, которым я могу написать или структурировать свой код в VB.NET, чтобы принудительно инициализировать переменные экземпляра до того, как вызывается конструктор базового типа , как это стандартное поведение в C #?

27
задан Community 23 May 2017 в 12:01
поделиться