Mahesh имеет правильный ответ, вы создадите ветвь для каждого и объедините изменения из своей ствола, когда захотите сделать релиз.
Я дам вам несколько советов: избегайте этого!
Неизбежно, , поскольку вы можете настроить полный код, вы будете . Даже «изменения пользовательского интерфейса» могут вызвать проблемы - если вы измените один и тот же фрагмент кода в транке и в пользовательской ветви, настроенной для клиента, это вызовет конфликт, который должен быть разрешен вручную при слиянии. По мере продвижения вперед изменения будут становиться все более и более сложными, а ваши филиалы будут все дальше отделяться от магистрали, ощущая себя все более и более похожим на совершенно другой продукт, нежели настройки.
Рассмотрим сценарий: вам нужно ввести новую функцию или реорганизовать существующую, чтобы исправить некоторые ошибки или просто упростить обслуживание. Однако это изменение нарушит существующий код (например, другие функции). Когда у вас есть единая база кода, по крайней мере, вы можете увидеть, где она сломается, и что вам нужно сделать, чтобы это исправить. Если у вас есть несколько настроенных веток, эта визуализация невозможна.
Лучшая альтернатива - посмотреть, что именно нужно сделать для всех этих клиентов, и создать структуру, позволяющую эти настройки, сохраняя при этом одну кодовую базу.
Если все, что вы хотите сделать, это изменить имя в строке заголовка и пару изображений, просто создайте файл конфигурации (.ini, или XML, или любой другой), который позволяет вам указывать эти вещи. Ваше приложение читает его при запуске. Теперь у вас есть одна кодовая база, и вы просто меняете файл настройки для любого клиента во время развертывания.
Если вам нужно настроить макет графического интерфейса (обычно называемый «скиннингом»), для этого есть готовые интегрированные среды.
В дальнем конце спектра, если вам ДЕЙСТВИТЕЛЬНО нужно предоставить настройки кода, сделайте это с помощью архитектуры плагинов. Создайте интерфейсы, которые предоставляют базовый API, а затем для каждого клиента создайте им настраиваемую библиотеку, которая реализует этот интерфейс, но имеет настраиваемые части для каждого. Вы можете поместить элементы управления, логику кода и т. Д. В библиотеки.
Подробности выходят за рамки этого вопроса, но вы можете сделать с этим практически все, не сталкиваясь с проблемами, которые будут представлять несколько копий (в основном) одного и того же кода.