Clon parcial de git con historial relevante

Digamos que he escrito un trillón de modules de marionetas y tengo toda su historia en un solo repository git, pero ahora realmente deseaba haber hecho un repository por module. Divisar la estructura del file es fácil porque cada uno está totalmente contenido dentro de su propio directory y está organizado como GIT_ROOT / modules / NAME .

¿Hay alguna manera de dividir este repository y no perder el historial de cada module? Lo ideal es que cada repos solo tenga un historial relevante para el module que representa. Intenté clonar todo y git rm -rf todo lo que es irrelevante, pero conserva la historia irrelevante.

Planeo pegarlos junto con los submodules de git, FWIW.

He estado jugando con esto un poco, y parece que la forma más fácil de dividir esto es usando git subtree split :

split

Extraiga un nuevo historial de proyecto sintético del historial del subtree. El nuevo historial incluye solo las confirmaciones (incluidas las fusiones) que afectaron, y cada una de esas confirmaciones ahora tiene los contenidos de en la raíz del proyecto en lugar de en un subdirectory. Por lo tanto, la historia recién creada es adecuada para exportar como un repository git separado.

Entonces, por ejemplo, si empiezo con el repository openstack-puppet-modules , que incluye un grupo de modules de marionetas individuales, podría dividirlos primero en twigs individuales como esta (solo estoy usando ocho modules aquí para mantener las cosas cortas) :

 for x in apache aviator ceilometer certmonger cinder common \ concat firewall; do git subtree split -P $x -b split-$x done 

Una vez que esto termine de ejecutarse, tengo:

 $ git branch | grep split- split-apache split-aviator split-ceilometer split-certmonger split-cinder split-common split-concat split-firewall split-pacemaker 

Cada una de esas twigs contiene solo el historial del directory específico. Si quiero transformarlos en repositorys separados, podría hacer esto:

 for x in apache aviator ceilometer certmonger cinder common \ concat firewall; do git init --bare ../repos/repo-$x git push ../repos/repo-$x split-$x:master done 

Ahora tengo una colección de repositorys:

 $ ls ../repos/ repo-apache repo-aviator repo-ceilometer repo-certmonger repo-cinder repo-common repo-concat repo-firewall work-cinder 

Y creo que hemos logrado tu objective.