git subtree split
hace exactamente eso. Dada una carpeta a través de --prefix
, generará un árbol separado dentro de su repositorio que puede enviar a otro repositorio y luego usarlo como mejor le parezca.
La versión actual del GIT (1.8.1) no incluye documentación del sub-árbol, pero se pueden encontrar aquí: https://github.com/apenwarr/git-subtree/blob/master/git-subtree.txt
El flujo se puede utilizar es:
# In Repo A create your subtree split and push it
> git subtree split --prefix sub --branch subBranch
> git push C subBranch:master
# After some changes that touched the sub directory
> git subtree push --prefix sub C master
El último comando Wil volver a dividir el árbol (utilizando las confirmaciones anteriormente divididas para mantener la integridad del árbol de C) y llevarlo al C/master
.
Si desea eliminar el historial al contenido empujado a C
puede utilizar la opción --squash
cuando git split
-ing y git push
-ing. Debe ser coherente y seguir utilizándolo, ya que si comienza a mezclar subárbol de contenido aplastado y no aplastado, no podrá dividir y reutilizar correctamente las divisiones anteriores, por lo que no podrá presionarlo al C
.
Por último, una vez que haya creado la primera división de sub
, no es del todo necesario que la elimine y la reimporte como un nuevo subárbol. Si lo mantiene git subtree
solo regenerará/reutilizar confirmaciones previamente creadas a partir de otras divisiones. Si elimina la carpeta y luego vuelve a agregar sub
desde las confirmaciones creadas, debería funcionar, y si está usando --squash
, coincidirá con lo que desea con C
que no tiene historial, pero mantiene el historial de A
).