Compartir submodules de Git

Tengo las Bibliotecas A, B, C y D.

las dependencies se ven así:

A | / \ BC \ / D 

Sin embargo, tenemos los repositorys Git B y C configurados con D como un submodule. nos gustaría configurar B y C como submodules en A, pero también nos gustaría que los dos apunten a una sola instancia de submodule de D.

¿Alguien sabe la manera correcta de hacer esto?

Si agrega B y C como submodules a A, sus files .git se almacenarán en A en .git / modules / B y .git / modules / C. Cada uno de ellos (una vez que hayas hecho git submodule init; git submodule update en cada uno) tendrá su propio .git / modules / D, sin embargo, por lo que los files repo no serán compartidos. Cada uno tendrá su propia copy de los files también.

Podría solucionar estos problemas con enlaces simbólicos. Por ejemplo, podría agregar D como un submodule solo a B, y luego enlazar B en forma de D en C. Ahora puede trabajar en B / D o C / D, y el otro permanecerá sincronizado. Sin embargo, hay 2 problemas con esto. La primera es que no puede verificar diferentes puntos en cada uno; deben estar sincronizados, porque son lo mismo. Sin embargo, esto es menor e incluso puede coincidir con sus deseos. El segundo es peor; si está rastreando D solo en B, y C está "rastreando" solo como a través de enlace simbólico a D de B (los enlaces simbólicos son entendidos por git, por cierto), entonces C no tiene forma de gobernar su propia dependencia de D.

Es normal hacer un cambio en un submodule y luego verificar ese cambio en el dependiente, que contiene el repository, pero ahora debes recordar saltar al otro repository del diamante y asegurarte de que funciona también (testing automática, especialmente si se ejecuta a través de un gancho git – puede ayudar mucho aquí). Si revierte una confirmación en B / D, por ejemplo, o echa un vistazo a una anterior, o cambia de twigs en B / D, siempre tiene que saltar a C / D y asegurarse de que las cosas sigan funcionando allí. Esta configuration puede convertirse en un poco de un dolor de microgestión, propenso a compromisos fallidos, donde B trabaja en contra de la D actual, pero C no lo hace, o viceversa.