У нас есть такой же сценарий, как и у вас, и мы используем многоаспектный подход для его решения:
1) Изменения, характерные для клиента, изолируются от основного приложения с помощью интерфейсов, переопределенных методов или новых методов (когда существующего недостаточно).
Это гарантирует, что базовая структура приложения обратно совместима с существующими решениями.
2) В редком случае, когда изменение должно применяться ко всем решениям, у нас есть одно мастер-решение, которое мы можем использовать для обновления всех проектов.
3) Непрерывная интеграция: при каждой регистрации автоматически создается каждое отдельное решение, а сообщения об успехах или неудачах рассылаются всем разработчикам, чтобы ответственные стороны могли исправить любые критические изменения.
Из-за задействованной ответственности (все знают, кто нарушил сборку), разработчики оказывают значительное (положительное) давление на то, чтобы убедиться, что они не являются причиной проблемы.
Мы используем CruiseControl.Net с хранилищем Subversion, но я уверен, что существует множество других решений, которые будут работать с вашим хранилищем.