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