Раздельное!
Фактически, у меня, вероятно, было бы три репозитория, один для клиента и соответствующих клиентских библиотек, один для сервера (и соответствующих библиотек) и один для общих библиотек (включая интерфейсы API, которые предоставляют функциональность между двумя , плюс любой другой общий код). Я думаю, что это действительно ключ, общий код должен идти в отдельный собственный репозиторий. Таким образом, вы можете быть уверены, что совместимость между вашим клиентом и сервером всегда одинакова, и она изолирована от дизайна каждого из его потребителей.
Очевидно, что это не всегда возможно, в зависимости от конкретной используемой коммуникационной среды, но, скорее всего, будет общий код, который определяет формат объектов передачи данных или шаги рукопожатия в вашем пользовательском протоколе (или некотором другом примере) ,
Предполагая, что у вас достаточно приличная настройка Continuous Integration и QA (довольно большое предположение, по моему опыту, но я все же сделаю это. Если у вас нет отдела QA, вы должны хотя бы получить некоторую CI), вы не должны Вам не нужно использовать шаблон с одним репо в качестве защиты от возможных несовпадений кода, либо ваш CI-сервер отметит совместимость библиотек, либо ваша команда QA обнаружит ошибки времени выполнения (или, что еще лучше, ваши юнит-тесты).
Преимущества разделенных репозиториев заключаются в возможности раздельного создания версий отдельных частей системы. Хотите взять копию Сервера прошлой недели и запустить его вместе с Клиентом этой недели, чтобы попытаться устранить причину проблемы с производительностью? Не стоит беспокоиться.