Хвост пост-фиксации SVN для изменения внешнего вида

У нас есть настройка Subversion, которая довольно широко использует svn:externals (более 5 внешних ссылок в одном проекте, и хотя большинство из них находятся в одном и том же хранилище, одна или две находятся в другом хранилище, но все еще на одном сервере). В настоящее время свойства svn:externals настроены таким образом, что они имеют полный URL-адрес указанного проекта (т. Е. "Https://[сервер]:[порт]/svn/Repository1/Projects/...)

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

Не уверен, что это лучший способ сделать это, но я хотел бы установить некоторый тип пост-фиксации хука в удаленном месте, который бы изменил свойства svn:externals и заменил здесь имя хоста нашего локального сервера на имя хоста удаленного сервера там. Этот хук запускается после каждого коммита, сделанного svnsync.

В идеале мы бы хотели избежать изменения наших свойств svn:externals в главном репозитории, чтобы они не включали имя сервера.

Кто-нибудь сталкивался с этим вопросом раньше? Каков наилучший способ сделать это?

2 ответа

Решение

Вы должны понимать, что svn:externals являются свойством файла, и для их изменения требуется фиксация. Если у вас есть зеркало, и вы измените svn:externalВы создаете новую удаленную версию и разбиваете свое зеркало. Изменения больше не будут выстраиваться.

Хотя в то время это казалось изящной идеей, svn:externals может быть очень плохим в проекте. Вообразите проект как это:

http://vegibank.com/svn/trunk/project1

И у меня есть в этом каталоге svn:external

$ svn pset svn:external "^/trunk/project2/foo foo" .

Я делаю это потому, что foo Каталог - это общий набор файлов для нескольких проектов.

Теперь я создаю тег для project1:

$ svn cp http://vegibank.com/svn/trunk/project1 http://vegibank.com/svn/tags/1.2.3

Выглядит красиво - кроме project1/foo каталог не помечен. Это связано с багажникомproject2/foo,

Я предполагаю, что тег никогда не меняется, но это не так. Работа еще продолжается project2/foo на стволе, и это меняет то, что представляет мой тег. Если у меня есть ошибка в версии 1.2.3, и я решил проверить свой тег, чтобы увидеть, в чем может быть проблема, я не обязательно получу то, что я выпустил в project1/foo - Я получаю последние из багажника.

Лучший способ справиться с этим - создать репозиторий релизов, создать код, общий для разных проектов в качестве некоего предварительно скомпилированного артефакта, и ваш проект зависит от этой версии этого артефакта. В конечном итоге он ничем не отличается от программы на C, зависящей от конкретной версии libz.so или Java-проект зависит от версии 1.6 org.apache.commons.httpd,

Это исключит использование svn:externals и упростить ваше зеркалирование. Вы можете отразить репозиторий релизов, а также исходный репозиторий.

Если вы настаиваете на использовании svn:external, не используйте полный URL. Вместо этого используйте относительные URL.

Например, если вы настроили ваш `svn:external выше вместо этого:

$ svn pset svn:external "^/trunk/project2/foo foo" .

сделать это:

$ svn pset svn:external "../project2/foo foo" .   #property on ^/trunk/project1

Теперь, если я создам тег, как это:

$ svn cp http://vegibank.com/svn/trunk http://vegibank.com/svn/tags/1.2.3

Я отмечаю оба project1 а также project2, Теперь мой svn:external относится к http://vegibank.com/svn/tags/1.2.3/project2/foo,

Вам нужен способ принудительного применения svn: externals таким образом, и вы можете использовать хук pre-commit, чтобы отклонить любой коммит, который имеет svn:external установить, что ссылается на trunk или же branches каталог без указания фактической ревизии.

Какую версию SVN вы используете? Если вы в курсе, вы можете не указывать имя хоста в svn:externals внимательно прочитайте инструкцию, начните с внешнего /

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

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

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