Separate!
De hecho, probablemente tendría tres repositorios, uno para el Cliente y las bibliotecas correspondientes solo para el cliente, uno para el Servidor (y las bibliotecas correspondientes), y uno para las bibliotecas compartidas (incorporando las interfaces API que exponen la funcionalidad entre los dos, más cualquier otro código compartido). Creo que esa es realmente la clave, el código compartido debe ir a un repositorio separado. De esa manera, puede asegurarse de que la interoperabilidad entre su cliente y el servidor se encuentre siempre en la misma versión Y esté aislada del diseño de cada uno de sus consumidores.
Obviamente, esto no siempre es posible, dependiendo del marco de comunicación en particular que esté utilizando, pero es probable que haya un código compartido que dicte el formato de los objetos de transferencia de datos o los pasos del protocolo de enlace en su protocolo personalizado (o algunos otro ejemplo).
Suponiendo que tiene una Integración continua y una configuración de control de calidad bastante decentes (una suposición bastante amplia, según mi experiencia, pero que voy a realizar de todos modos. Si no tiene un departamento de control de calidad, al menos debería obtener un IC ) no debería necesitar usar el patrón de repo único como una defensa contra posibles errores de coincidencia de código, ya sea su servidor de CI marcará la interoperabilidad de la biblioteca o su equipo de control de calidad detectará errores de tiempo de ejecución (o, mejor aún, sus Pruebas de unidad será).
Los beneficios de los repositorios divididos se encuentran en la capacidad de crear versiones separadas de partes de un sistema por separado. ¿Desea tomar una copia del Servidor de la semana pasada y ejecutarlo con el Cliente de esta semana para intentar bloquear la raíz de un problema de rendimiento? No te preocupes.