Не уверен, что кто-то сказал это, здесь много длинных ответов, и я не прочитал их все.
Я думаю, что лучшим подходом к управлению версиями было бы размещение вашей CMS отдельно в своем репозитории, а каждый проект - в отдельности. (или все это могут быть подпапки в одном репо, я думаю)
Затем вы можете использовать его ствол (или определенную ветку / тег, если хотите) в качестве svn: external в каждом проекте, который в этом нуждается. Таким образом, любые обновления, которые вы вносите в CMS, могут быть зафиксированы обратно в ее репозиторий и будут добавляться в другие проекты по мере их обновления svn (или внешним является svn: switch 'ed).
Чтобы упростить эту задачу, вам нужно убедиться, что CMS и пользовательские функции расположены в разных папках, чтобы внешние функции svn работали правильно.
IE:
project
project/cms <-- cms here, via svn external
project/lib <-- custom bits here
project/www <-- folder to point apache/iis at
(в случае необходимости вы можете иметь cms и lib в папке www)
Это позволит вам ветвиться / отмечать каждый проект по вашему желанию. Вы также можете переключать расположение svn: external для каждой ветви / тега.
С точки зрения получения изменений, я бы посоветовал вам немедленно избавиться от ftp и использовать rsync или svn checkout / exports. Оба работают хорошо, выбор за вами.
У меня больше всего опыта работы с маршрутом rsync, rsyncing экспорта svn на сервер. Если вы пойдете по этому пути, напишите несколько сценариев оболочки, и вы можете создать тестовый сценарий оболочки, который покажет вам файлы, которые он будет загружать без загрузки, также используя флаг -n. Я обычно использую пару сценариев для каждой среды - один тест, а другой - для этого.
Аутентификация с общим ключом, поэтому вам не нужен пароль для отправки загрузок, также может быть полезна, в зависимости от того, насколько защищен сервер, которому предоставляется доступ.
Вы также можете использовать другой сценарий оболочки для массовых обновлений, который просто вызывает соответствующий сценарий оболочки для каждого проекта, который вы хотите обновить.