Использование Mercurial для разделения частной и общедоступной версии

Как вы используете Mercurial для следующей проблемы.

Предположим, у меня есть библиотека Core. Теперь я хочу разработать расширение для этой библиотеки под названием Extension. Я хочу, чтобы Core физически отличался от Extension, то есть предположим, что Core - это библиотека с открытым исходным кодом, а Extension - это частная библиотека, которая основывается на Core (возможно, в ней есть некоторые вещи, которые я хочу сохранить лично. Очевидно, я не хочу выталкивать весь источник в Extension в публичный репозиторий. Но, с другой стороны, мне может потребоваться внести определенные изменения от расширения к ядру (если бы я решил "пожертвовать" часть расширения на ядро) или наоборот (если я хочу включить исправления ошибок, скажем).

Как бы вы это сделали, сводя к минимуму риск утечки Extension to Core (как только история будет перенесена на общедоступный сервер, туда не вернется!), сохраняя гибкость, чтобы сделать это для определенных изменений. Ветви? Клоны? MQS? Что-то другое?

В настоящее время я только знаком с клонированием репозиториев и очень похож на его простоту.

EDIT: Я придумал эту схему, но я не могу заставить ее работать под окнами. Два репозитория (ядро и расширение). В Extension есть две ветки, также ядро ​​и расширение. Теперь вы можете зарегистрировать на репозитории крючок в Mercurial, поэтому я хотел бы зарегистрировать крюк pretxnchangegroup в репозитории Core, который запрещает верификации из ветки расширения, в качестве объяснения в книге Mercurial. Кроме того, я не совсем понимаю, что работать под окнами. Итак:

  • У кого-нибудь есть пример чего-то подобного (на самом деле, любой крючок, который изменяет результат транзакции) под окнами?
  • Я все еще смогу использовать трансплантацию для изменений cherrypick из ветки Extension to the Core, правильно?

Ответ 1

После некоторого тестирования я собираюсь попробовать эту схему. Два основных репозитория и две названные ветки, Core и Extension.

Один основной репозиторий Core, который должен содержать только Core changeets и source. Таким образом, он должен содержать только набор изменений из ветки ядра. Это проверяется, используя следующий репозиторий в hgrc этого репо:

pretxnchangegroup.branch = hg heads --template "current branches: {branches} " | find "Extension" && exit 1 || exit 0

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

Второе репо содержит как ветки ядра, так и расширения и изменения, и в них происходит обмен обменов между двумя ветвями. Нормальное слияние от Core to Extension и пересадка от Extension to Core.

надеюсь, что это поможет кому-то другому.

Ответ 2

(как только история будет нажата, не возвращайся!)

уверен, что есть... что касается управления версиями!

Я раньше ничего не делал, но похоже, что команда transplant будет полезна. Кроме того, вы можете иметь клоны клонов и нажимать на любой из них и т.д.

Ответ 3

Расширение леса позволяет сохранить несколько репозиториев как часть большого. Похоже, это может помочь здесь.