2009-12-09 19 views
139

¿Puedo anidar repositorios de git? Tengo:repositorios git anidados?

/project_root/ 
/project_root/my_project 
/project_root/third_party_git_repository_used_by_my_project 

¿Tiene sentido a git init/añadir el/project_root para facilitar la administración de todo localmente o tengo para administrar mi_proyecto y la tercera una de las partes por separado?

Respuesta

124

Quizás esté buscando la función Git llamada submodules. Esta característica lo ayuda a administrar repositorios dependientes que están anidados dentro de su repositorio principal.

+29

Como un principiante relativo de git, encontré que este blog/tutorial es más fácil de comprender http://chrisjean.com/2009/04/20/git-submodules-adding-using-removing-and-updating/ Se necesita un tutorial más simple enfoque centrándose en solo git en lugar de tener el contexto de un script de shell auxiliar; Me pareció más fácil de leer. –

+2

El blog de chrisjean.com no parece estar basado en el hecho de haberlo intentado. La publicación de la wiki de Greg puede ser un poco más complicada, pero como novato git prefiero preciso a simple ... – sage

3

Usaría un repositorio por proyecto. De esta forma, la historia se vuelve más fácil de navegar.

También verificaría la versión de la biblioteca de terceros que estoy usando, en el repositorio del proyecto que la usa.

34

Coloque sus bibliotecas de terceros en un repositorio independiente y use submódulos para asociarlas con el proyecto principal. Aquí es un paseo a través de:

http://git-scm.com/book/en/Git-Tools-Submodules

Al decidir cómo segmentar un acuerdo de recompra por lo general sería decidir en base a la frecuencia con la que iba a modificarlos. Si se trata de una biblioteca de un tercero y solo los cambios que realiza están actualizando a una versión más nueva, entonces definitivamente debe separarla del proyecto principal.

14

git-subtree le ayudará a trabajar con proyectos múltiples en un solo árbol y mantener un historial separable para ellos.

+3

Esta característica se ha fusionado posteriormente en Git. Aquí hay una buena descripción: https://developer.atlassian.com/blog/2015/05/the-power-of-git-subtree – nobar

16

simplemente para la corrección:

Hay otra solución, yo recomendaría: subtree merging.

A diferencia de los submódulos, es más fácil de mantener. Debería crear cada repositorio de la manera normal. Mientras está en su repositorio principal, desea fusionar el maestro (o cualquier otra rama) de otro repositorio en un directorio de su directorio principal.

$ git remote add -f OtherRepository /path/to/that/repo 
$ git merge -s ours --no-commit OtherRepository/master 
$ git read-tree --prefix=AnyDirectoryToPutItIn/ -u OtherRepository/master 
$ git commit -m "Merge OtherRepository project as our subdirectory"` 

Luego, con el fin de tirar del otro depósito en su directorio (para actualizarlo), utilizar la estrategia de combinación de subárbol:

$ git pull -s subtree OtherRepository master 

estoy usando este método desde hace años, funciona :-)

Más acerca de esta manera, incluyendo la comparación con los módulos secundarios se pueden encontrar en este git howto doc.

+0

El subárbol de fusión de referencia en el libro de git ya no funciona. Actualmente, este parece ser el enlace: https://git-scm.com/book/es/v2/Git-Tools-Advanced-Merging#_subtree_merge – ericx

11

Se podría añadir

/project_root/third_party_git_repository_used_by_my_project 

a

/project_root/.gitignore 

que debe impedir el repositorio anidada que se incluirán en el repositorio de los padres, y se puede trabajar con ellos de forma independiente.

Pero: si un usuario ejecuta git clean -dfx en el repositorio principal, eliminará el repositorio anidado ignorado. Otra forma es enlazar simbólicamente la carpeta e ignorar el enlace simbólico.Si luego ejecuta git clean, el enlace simbólico se elimina, pero el repositorio "anidado" permanecerá intacto, ya que realmente reside en otro lugar.

Cuestiones relacionadas