Repositorios anidados de Git?

182

¿Puedo anidar repositorios de Git? Yo tengo:

 /project_root/
 /project_root/my_project
 /project_root/third_party_git_repository_used_by_my_project

¿Tiene sentido que git init/addel /project_rootde facilitar la gestión de todo localmente o tengo para administrar my_projecty la tercera una de las partes por separado?

Jeremy Raymond
fuente

Respuestas:

159

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

Greg Hewgill
fuente
43
Como un principiante de git relativo, encontré este blog / tutorial más fácil de entender. Chrisjean.com/2009/04/20/… Se necesita un enfoque más simple al enfocarse solo en git en lugar de tener el contexto de un script de shell auxiliar; Me resultó más fácil de leer.
John K
44
El blog de chrisjean.com no parece estar actualizado solo por haber tratado de seguirlo. La publicación wiki de Greg puede ser un poco más complicada, pero como novato gitano prefiero lo preciso a lo simple ...
sabio
El blog parece funcionar bien ahora, y desafortunadamente para Sage, los 34 (ahora 35) votos positivos en el comentario parecen estar de acuerdo en que hay un valor en el artículo del blog. Resulta que no tiene que sacrificar la precisión por claridad y consejos específicos de operación. Después de leerlo, me imagino que el autor ya investigó un poco y probablemente leyó la documentación real de Git , no solo la página wiki de kernel.org. La explicación orientada a Git del autor del blog en un ejemplo totalmente contextualizado parece ser bastante útil para una gran cantidad de personas ...
Matthew Weber
13
Por cierto, ese enlace chrisjean mencionado anteriormente está muerto. El enlace actualizado es chrisjean.com/git-submodules-adding-using-removing-and-updating
sprksh
35

Coloque sus bibliotecas de terceros en un repositorio separado y use submódulos para asociarlas con el proyecto principal. Aquí hay un recorrido:

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

Al decidir cómo segmentar un repositorio, generalmente decidiría según la frecuencia con la que los modificaría. Si es una biblioteca de terceros y solo los cambios que está haciendo se están actualizando a una versión más nueva, entonces definitivamente debe separarla del proyecto principal.

Igor Zevaka
fuente
22

Solo para completar:

Hay otra solución, recomendaría: fusión de subárbol .

A diferencia de los submódulos, es más fácil de mantener. Crearía 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, para extraer el otro repositorio en su directorio (para actualizarlo), use la estrategia de combinación de subárbol:

$ git pull -s subtree OtherRepository master

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

Puede encontrar más información sobre esta forma, incluida la comparación con submódulos, en este documento de instrucciones de git .

Phil
fuente
La referencia de fusión del subárbol en el libro git ya no funciona. Actualmente, este parece ser el enlace: git-scm.com/book/en/v2/…
ericx
18

Podrías agregar

/project_root/third_party_git_repository_used_by_my_project

a

/project_root/.gitignore

eso debería evitar que el repositorio anidado se incluya en el repositorio principal, y 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 hacer un enlace simbólico a 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.

Mikkelbreum
fuente
5

Resumen.

¿Puedo anidar repositorios git?

Si. Sin embargo, por defecto, git no rastrea la .gitcarpeta del repositorio anidado. Git tiene características diseñadas para administrar repositorios anidados (sigue leyendo).

¿Tiene sentido usar git init / add / project_root para facilitar la administración de todo localmente o tengo que administrar my_project y el tercero por separado?

Probablemente no tenga sentido ya que git tiene características para administrar repositorios anidados. Las funciones integradas de Git para administrar repositorios anidados son submoduley subtree.

Aquí hay un blog sobre el tema y una pregunta SO que cubre los pros y los contras de usar cada uno.

lachy
fuente
2

Usaría un repositorio por proyecto. De esa manera, 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.

GNUD
fuente