2012-09-25 12 views
6

Después de mi pregunta Git subtree export and re-import woes Quería preguntar cómo convertiría una carpeta a un subárbol.Hacer que la carpeta existente sea un subárbol de git

Imagine que tengo un repositorio A donde tengo un código que ahora debería ser compartido con otro proyecto (y posiblemente más), así que puse todo el código compartido en la carpeta "sub". Esta carpeta ahora debe extraerse (sin el historial, si es posible) en el repositorio desnudo C. Después, "sub" debe convertirse en un subárbol de C, sin embargo, sin perder el historial en A (muy importante). También quiero poder hacer cambios en "sub" y llevarlos de vuelta a C.

Respuesta

7

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).

Cuestiones relacionadas