¿Cómo usar efectivamente los repositorys / submodules de Git para un producto C ++ que tiene muchas dependencies?

Soy muy nuevo en Git y sigo descifrando cosas … Creo que finalmente estoy entendiendo todos los aspectos de la bifurcación / fusión. Pero todavía no estoy seguro de cuál es la mejor solución para manejar dependencies de proyectos. ¿Cuál es la mejor práctica? Este tiene que ser un problema común y, sin embargo, no puedo encontrar un buen tutorial o la mejor práctica para hacer esto.

Supongamos que tengo un producto de C ++ que depende de otras bibliotecas de C ++, y que finalmente forma un complicado gráfico de dependencia. Bibliotecas como: otras librerías C ++ desarrolladas internamente, bibliotecas públicas de código abierto, bibliotecas de código abierto lists para usar

El código fuente final del producto C ++ se basa en el resultado de sus dependencies para poder comstackr. Estos productos se componen de:

  • Una serie de files de encabezado de C ++ (observe que los files de implementación de C ++ están ausentes)
  • Un set de binarys comstackdos (files LIB, files DLL, EXE, etc.)

Según entiendo, debería poner cada biblioteca en su propio repository. Entonces parece que los submodules de Git son principalmente lo que estamos buscando. La reseña en http://chrisjean.com/2009/04/20/git-submodules-adding-using-removing-and-updating/ en particular parece una buena introducción y casi puedo entender. Por ejemplo, podría hacer que mi repository principal de proyectos se refiriera a un repository externo específico de Git como un submodule / dependencia. El código de C ++ puede "#include" files de encabezado en los directorys de submodules apropiados. Un script de compilation incluido con el producto / repository maestro podría proceder a la compilation recursiva de todos los submodules.

OK ahora la pregunta:

¿Cómo se almacenan normalmente los binarys para cada repository? Algunas de nuestras dependencies tardan horas en comstackrse y no se actualizan con mucha frecuencia. Con el esquema anterior, podría clonar / verificar un proyecto de alto nivel del server para arreglar un pequeño error. Ahora, tal como lo entiendo, también me veo forzado a clonar todos los miles de files que componen cada una de estas dependencies de código abierto. Me preocupa que pueda llevar algo de time (especialmente en Windows). Peor aún, ¿no sería entonces forzado a recomstackr todos y cada uno de los submodules, incluso si nadie ha cambiado ese submodule durante meses? (Parece que sería útil algún tipo de esquema de "tabla hash" local en cada computadora desarrolladora que vincule un ID de set de cambios a un set de binarys comstackdos …)

(Una tienda anterior en la que trabajé hace unos años usaba Mercurial, la extensión de, pero todos los proyectos internos de código, etc., se incluía en un solo gran repository gigante, y uno tenía que build todo en un gran script monolítico cuando clonar una twig recién creada desde el server. Cuando terminamos con la function de reparación / nueva y nos fusionamos con la versión anterior, eliminamos el repository local para esa twig en particular).

Estamos desarrollando en Windows, pero eventualmente nos ramificaremos a otras plataforms que no sean de Microsoft, por lo que la portabilidad es importante.

Normalmente esta es una mala idea, pero ¿por qué no verifica los binarys en los submodules y el código comstackdo para los submodules que no cambian a menudo? De esta forma, la búsqueda arrojará los contenedores, y cuando compile una nueva versión de una dependencia con binarys cambiados, verá que los binarys se muestran en la salida de estado de git.