Использование Mercurial для разделения частной и общедоступной версий
-
03-07-2019 - |
Вопрос
Как бы вы использовали Mercurial для решения следующей проблемы?
Предположим, у меня есть библиотечное ядро.Теперь я хочу разработать расширение к этой библиотеке под названием Extension.Я хочу сохранить Ядро физически отделенным от Расширения, т.е.допустим, Core - это библиотека с открытым исходным кодом, а Extension - частная библиотека, основанная на Core (возможно, она содержит какие-то материалы, которые я хочу сохранить личными.Неважно.) .Очевидно, что я никогда не хочу загружать весь исходный код в расширении в общедоступный репозиторий.Но, с другой стороны, я мог бы захотеть перенести определенные изменения из расширения в Ядро (если бы я решил "пожертвовать" часть расширения Ядру) или наоборот (скажем, если я хочу включить исправления ошибок).
Как бы вы поступили по этому поводу, минимизируя риск утечки расширения в ядро (как только история будет передана на общедоступный сервер, пути назад не будет!), сохраняя при этом гибкость, позволяющую делать это для определенных изменений.Ветви?Клоны?Mqs?Что-то еще?
В настоящее время я знаком только с клонированием репозиториев, и мне очень нравится его простота.
Редактировать: Я придумал эту схему, но я не могу заставить ее работать под Windows.Два репозитория (Ядро и Расширение).В расширении есть два ветви, а также Ядро и расширение.Теперь вы можете зарегистрировать для каждого репозитория перехват в Mercurial, поэтому я хотел бы зарегистрировать перехват 'pretxnchangegroup' в основном репозитории, который запрещает проверки из ветви расширения, как вроде как объяснено в книге переменчивости.За исключением того, что я не совсем понимаю, как это работает под Windows.Итак:
- у кого-нибудь есть пример чего-то подобного (фактически, любого хука, который изменяет результат транзакции) под Windows?
- Я бы все еще мог использовать transplant для внесения изменений в cherrypick из расширения в основную ветвь, верно?
Решение
После некоторого тестирования я собираюсь опробовать эту схему.Два основных репозитория и две именованные ветви, Core и Extension.
Один основной репозиторий ядра, который должен содержать только основные наборы изменений и исходный код.Таким образом, он должен содержать только наборы изменений из основной ветви.Это проверяется с помощью следующего перехвата репозитория в hgrc этого репозитория:
pretxnchangegroup.branch = hg heads --template "current branches: {branches} " | find "Extension" && exit 1 || exit 0
Выглядит немного странно, но в основном он запускается после завершения нажатия или вытягивания, но до того, как оно будет зафиксировано.В этот момент, если перехват завершается неудачей, транзакция откатывается.Таким образом, перехват ищет набор изменений ветви расширения и завершается неудачей, если он его находит, фактически запрещая изменениям расширения попадать в основное репозиторий.
Второе репозиторий содержит как ветви ядра, так и расширения и наборы изменений, и именно здесь происходит обмен наборами изменений между двумя ветвями.Обычное слияние из Ядра в Расширение и пересадка из Расширения в Ядро.
надеюсь, это поможет кому-то еще.
Другие советы
(как только история будет перенесена, пути назад уже не будет !)
конечно, есть...вот что такое контроль версий!
Я не делал ничего подобного раньше, но это звучит так, словно пересадка команда будет полезна.Кроме того, у вас могут быть клоны клонов и переходить к любому из них и так далее.
Тот Самый Расширение леса позволяет вам сохранять несколько репозиториев как часть одного большого.Похоже, это могло бы здесь помочь.