Как можно настроить корреляцию внешних воздействий? Должен ли один? - PullRequest
0 голосов
/ 27 октября 2011

У нас есть пара приложений Zend_Framework, которые мы хотели бы хранить в отдельных репозиториях Subversion. Однако эти приложения используют один и тот же уровень абстракции базы данных и несколько общих компонентов.

Мы бы хотели как-то поделиться общими битами между приложениями. Текущая идея у нас выглядит как

svn://foo/itg-common/trunk
svn://foo/itg-common/branches/foo
svn://foo/itg-common/branches/production

svn://foo/itg-app/trunk
svn://foo/itg-app/branches/foo
svn://foo/itg-app/branches/production

Теперь нам хотелось бы, чтобы в репозитории itg-app была внешняя ссылка на репозиторий itg-common. Проблема в том, что мы хотим, например, itg-app/trunk/common для привязки к itg-common/trunk, itg-app/branches/foo/common для привязки к itg-common/branches/foo и т. Д. То есть общий шаблон itg-app/$BRANCH/common -> itg-common/$BRANCH.

Теперь, в принципе, мы могли бы создать эти внешние объекты, но проблемы возникают всякий раз, когда мы пытаемся слиться. Например. слияние с $/trunk до $/branches/production перезапишет свойство svn:externals, чтобы $/branches/production/common указывало на itg-common/trunk.

Имеет ли это смысл? Если это так, есть ли способ обойти эту проблему? Если это не так, почему бы и нет, и что мы должны делать вместо этого?

Ответы [ 2 ]

3 голосов
/ 27 октября 2011

Имеет ли это смысл?Если это так, есть ли способ обойти эту проблему?Если это не так, то почему бы и нет, и что мы должны вместо этого делать?

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

Еще одна вещь, которую я бы пересмотрел, если бы я был вами, ссылается на другое хранилище.IME ссылается на внешний относительно текущего проекта или корня хранилища гораздо лучше, чем с использованием абсолютных путей.Просто подумайте о том, что вы можете изменить протокол с svn: на, скажем, https:.(Я видел, как это происходило с компанией, и, несмотря на то, что для изменения всех внешних элементов в значительной степени полагался на сценарии, этот переход был беспорядком, о котором все участвуют, и у него постоянно возникают кошмары.) Относительные пути к внешним элементам просто более устойчивы, но они доступны только внутриединый репозиторий.


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

Но разветвление проекта в этом параметре - настоящая боль в шее , потому что недостаточно закрепить внешние элементы проекта, когда сами они ссылаются на неподкрепленные внешние элементы.Всякий раз, когда вам нужно выполнить ветвь проекта foo до foo', который через внешний источник ссылается на проект X, который, в свою очередь, через внешний источник ссылается на проект XX, вам потребуется ветка foo'XX, который является внешним в foo' ветви X, который является внешним по отношению к foo'.Представьте себе полдюжины внешних элементов в foo, половина из которых имеет свои собственные внешние элементы, некоторые рекурсивные три или более слоев, и вы достигнете точки, когда проект XXX изобилует ветвями, созданными для проектов, о которых он даже не должен знать,

Наше решение состоит в том, чтобы либо рекурсивно либо A) заменить все внешние элементы ветвью, на которую они ссылались, либо B) настроить ответвление внешнего X in foo/branches/externals/foo'/X, на который ссылается <project>/branches/foo' (с самим foo/branches/externals/foo'/X, ссылающимся на foo/branches/externals/foo'/XX).Однако настройка этого при создании foo' невероятно сложна и дает более чем достаточно шансов для совершения глупых ошибок, поэтому мы используем сценарии для рекурсивного спуска проекта и его внешних компонентов и делаем все это.

1 голос
/ 27 октября 2011

Вы должны подключаться только к одному репо в приложении.Я предполагаю, что это будет «производственная» ветка в вашем общем репо.По сути, вы рассматриваете внешний объект как отдельный проект с собственным жизненным циклом разработки.

...