Я могу вспомнить два подхода, которые могут сработать.
Первый включает ответвление кода для каждого клиента. Любое редактирование, которое вы делаете в главной строке, может быть интегрировано в ветку конкретного клиента, когда это необходимо. Точно так же, если что-то в основном продукте зафиксировано в филиале, его можно объединить обратно в основную линию для последующего распространения в филиалах других клиентов. Хотя это может показаться лучшим подходом, может быть сложно поддерживать и отслеживать, какая ветвь имеет какие правки будут чреваты.
Второй, и, возможно, лучший подход, включает в себя рефакторинг вашего кода, чтобы код для конкретного клиента находился в одной сборке - по одной для каждого клиента. Затем это настраивается, возможно, с помощью внедрения зависимости, когда продукт установлен. Таким образом, у вас есть только одна строка кода и нет слияния между ветвями. Хотя это зависит от того, что специфичный для клиента код легко выделяется.