Proyectos de Git con código común

Tenemos varios proyectos en las obras que comparten la mayoría de sus files de código / configuration. El marco que estamos utilizando tiene ciertas dependencies de directorys y files que nos limitan a la cantidad de segregación de código común. Por ejemplo, entre 'common', 'projectA' y 'projectB' podríamos tener:

/ projectA

  • / shanetworking_dir1
    • common1
    • fileA1
    • fileA2
  • / common_dir2
    • common2
  • / dir3
    • fileA3
  • common3
  • fileA4

/ projectB

  • / shanetworking_dir1
    • common1
    • fileB1
  • / common_dir2
    • common2
  • / dir3
    • fileB2
    • fileB3
  • common3
  • fileB4
  • fileB5

Actualmente lo gestionamos con 3 proyectos Git: 'common', 'projectA' y 'projectB', con files comunes separados en files 'comunes' y proyectos específicos en sus propios proyectos. 'projectA' y 'projectB' tienen un .gitignore con inputs para todos los directorys comunes y todos los files comunes debajo de cada directory compartido. Una secuencia de commands copy 'común' en el proyecto que desea trabajar y el desarrollo se realiza allí. Una vez que se realiza un cambio, otra secuencia de commands copy todos los directorys comunes y files comunes de nuevo en 'común'. Los cambios en 'común' y en el proyecto se pueden ver a través de 'estado de git'.

Esto obviamente viene con sus dolores de cabeza de copyr hacia adelante y hacia atrás entre 'común', mantener .gitignore preciso, y cambiar twigs dentro de 'projectA' y 'projectB'. Sin embargo, al planear el 'proyecto C-F', este enfoque parece agradable ya que podemos evitar la fusión de cambios comunes a N proyectos.

Buscando consejos sobre cómo mantener mejor este tipo de estructura. Los submodules parecen imposibles de resolver dada la falta de segregación, a less que hiciéramos una gran cantidad de ellos. He visto algunas alternativas prometedoras usando enlaces simbólicos, pero eso también viene con sus problemas. Cualquier consejo sería apreciado.

¿Has considerado el subtree de git?

Algo como esto se puede hacer:

git remote add common git://server/common.git git fetch common git checkout -b common_branch common/master git checkout master git read-tree --prefix=common/ -u common_branch 

Lea más en los enlaces a continuación:

http://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html

http://progit.org/book/ch6-7.html

Si está dispuesto a poner el código compartido en un repository de git separado, es posible que le interesen los submodules git. Un submodule le permite include un repository git dentro de otro repository.

Aquí hay un par de enlaces: