Первое, что вы должны сделать в первую очередь, это убедиться, что структура вашего компонента (то, как вы структурировали вашу программу в слабо связанные библиотеки) соответствует вашим требованиям.
Все становится намного проще, когда у вас есть общий код в одной или нескольких отдельных библиотеках, а также другой код (но четко отделенный от общего кода). Затем вы можете обрабатывать свой общий код как отдельный продукт, а разные «версии» (как вы их называете) как отдельные программы, каждая из которых использует определенную ревизию общей библиотеки.
Сказал, что оба подхода (отдельные репозитории или один большой репозиторий) могут работать. Если ваши разные «версии» должны быть действительно отдельными, потому что они предназначены для разных клиентов с разными соглашениями о поддержке, отдельные репозитории IMHO будут работать лучше (по одному для каждого продукта и по одной для вашей общей библиотеки), потому что вы можете легче избежать нежелательной стороны эффекты между разными версиями. С другой стороны, если ситуация отличается, наличие всех вещей в одном репозитории может сэкономить вам много административной работы, например, когда вам часто приходится перемещать код из общей библиотеки в один из других компонентов или наоборот .
Например, в нашей компании у нас есть один репозиторий для программного продукта, проданного другим компаниям, и один для нашего собственного программного обеспечения. Очевидно, у нас очень разные потребности в поддержке между этими двумя типами программного обеспечения. Когда мы добрались до точки, где нам нужно было повторно использовать библиотеку из нашего продукта во внутреннем коде, мы написали несколько простых сценариев, чтобы проверить конкретную версию библиотеки и скопировать ее в среду сборки внутреннего кода. , Мы стараемся избегать слишком большого влияния внутренней разработки программного обеспечения на разработку продукта, но когда есть внутреннее требование, которое явно относится к общей библиотеке, мы добавляем его туда, тестируем в сочетании с нашим продуктом, и когда он работает, мы обновляем наш скрипт, чтобы получить новую ревизию.