Mercurial "ветки вендора" из внешних репозиториев?

Я хочу сохранить проект в Mercurial, который содержит внешний код (который я могу изменить) из репозиториев Git и SVN. В SVN я решал бы это с помощью веток вендоров и копировал код, но я понимал, что в Mercurial лучше иметь разные репозитории для разных проектов, и при необходимости переключаться между ними.

Макет проекта будет таким:

 - externalLibraryA [происходит из репозитория SVN]
  - ... с некоторыми дополнительными файлами от меня
 - externalLibraryB [происходит из репозитория SVN]
  - ... с некоторыми дополнительными файлами от меня
  - externalPluginForExternalLibraryB [происходит из репозитория Git]

В Subversion я бы создал vendor режиссёр trunk dir, сначала скопируйте все внешние библиотеки vendor, а затем в нужном месте в trunk, (Я думаю) Я могу сделать это и в Mercurial, с суб-репозиториями, но разве это лучший способ сделать это?

Я попытался настроить различные репозитории для внешних библиотек, но потом кажется, что я не могу вытащить externalLibraryARepo в externalLibraryA каталог моего основного хранилища? Он идет в основной каталог, что не то, что я хочу. Я также могу создать зеркальный репозиторий Mercurial и включить его в качестве вложенного репо в свой основной репозиторий, но затем изменения в этом подкаталоге отправляются в зеркальный репозиторий, а я хочу, чтобы они оставались в основном репозитории.

2 ответа

Это зависит от того, будет ли ваш код настраиваться вашей командой или нет. Наши команды добились больших успехов, поддерживая ветвь с именем "vendor" в репозиториях с нашими собственными настройками веток, названных по имени проекта. Этот код вендора затем легко включается в проект в качестве вложенного репозитория.

Предостережение в этом подходе: если активная разработка происходит в под-репозитории, лучше оставить его для прямого редактирования под-репозитория в качестве отдельного клона, в противном случае возникает необходимость обратить пристальное внимание на репозиторий верхнего уровня, чтобы избежать непреднамеренного увеличения ваш.hgsubstate перешёл на неверную ревизию и сломал вашу сборку.

Следите за слияниями репозитория верхнего уровня (вашего проекта) между версиями, которые указывают на разные именованные ветви вашего под-репозитория, так как это может привести к слиянию между ветвями "vendor" и "project" в под-репозитории, когда оно повторяется, что может быть нежелательно.

Обратите внимание, что эта функциональность может измениться и в будущем, так как в последние месяцы в списках рассылки mercurial-devel ведутся некоторые "теплые" дискуссии о будущем рекурсии субпозитория.

редактировать: я только что видел это обсуждение в связанных ссылках, которые, кажется, актуальны: /questions/15190665/vendor-vetvlenie-rtutnyij-stil/15190680#15190680

Вероятно, я бы просто сохранил это в одном репозитории - обратите внимание, что в приведенной вами ссылке они в конце концов используют свою систему сборки для объединения двоичного вывода из разных репозиториев. Я не совсем понимаю их обоснование.

Если основная проблема, которую вы пытаетесь решить, заключается в том, как обновить внешние компоненты чистым способом, я бы, вероятно, использовал для этого анонимное ветвление.

Т.е. добавить внешнюю библиотеку в ваш проект и ваши модификации. Убедитесь, что это работает. Тег с ExternalA-v1.0. Взломай свой реальный проект. Теперь у ExternalA, Inc. есть новая версия их материала. Обновите репо до тега ExternalA-v1.0. Импортируйте их новую версию и примените ваши модификации сверху. Commit. Теперь у вас есть две главы: одна с последней версией вашего кода (которая работает с ExternalA-v1.0) и одна с последней версией ExternalA (которая, возможно, не работает с вашим кодом). Тогда вы объединяете и примиряете их. Снова отметьте, теперь с ExternalA-v2.0. Повторите по мере необходимости.

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

Другие вопросы по тегам