Используйте стабильную ветку и Subversion> = 1.5 (сервер, формат репозитория и клиенты).
Сделайте ветку из Trunk и обозначьте ее как вашу стабильную ветку. Запретите разработчикам вносить изменения в эту ветку, в идеале используйте файл authz с любыми доступными вам разрешениями.
Имейте политику, которая гарантирует, что любые изменения кода передаются в Trunk до того, как они могут быть развернуты, даже если эти изменения произошли в отдельной ветви.
Имейте часы круиз-контроля, постройте и разверните из назначенной стабильной ветви вместо ствола.
Когда наступит время для развертывания нового программного обеспечения, используйте функцию слияния Subversion для объединения в ветку из магистрали. Всегда объединяйте таким образом, только из транка, и отслеживание слияния (только версия 1.5 и выше) гарантирует, что вы можете выбрать и включить только те изменения, которые вы хотите из транка, исключая то, что вам не нужно. Это также позволит вам визуально проверить, какие именно ревизии включены в текущий выпуск, а какие исключены.
После объединения и проверки результатов фиксация кода приведет к публикации круиз-контроля, поэтому публикация происходит только в контролируемых точках.
Если вам необходимо выполнить откат к предыдущей версии, создайте тег из требуемой ревизии стабильной ветви и временно укажите Круиз-контроль на нее вместо стабильной ветви, когда вы разобрались с проблемами в стабильной ветви, затем вы можете снова выполнить развертывание из стабильной ветви вместо тега.
Возможно, вы захотите заранее сделать теги до возникновения проблем, возможно, автоматически с помощью CruiseControl, чтобы теги уже были на месте, если вам нужно переключиться.
Не занимайтесь разработкой стабильной ветви, за исключением устранения конфликтов слияния, или объединяйте изменения из других мест, кроме транка, - очень трудно будет точно сказать, что развернуто.