¿Cómo configurar un proyecto git para usar un submódulo de repositorio externo?

213

Me gustaría crear un repositorio que extraiga un repositorio remoto.

Por ejemplo, digamos jQuery como un submódulo:

git://github.com/jquery/jquery.git

¿Cuál sería el proceso de crear un repositorio con jQuery como submódulo y agregar mi propio repositorio externo como un repositorio remoto?

Además, una vez que se configura, si presiono / tiro a mi propio control remoto, ¿permanecerá intacto el externo?

Tom
fuente
1
Cuando dice "pull in", ¿quiere decir que el repositorio jQuery es un submódulo de su propio repositorio?
ezod
Sí exactamente, lo siento si eso no está claro. Me gustaría saber cómo configuro esto como externo mientras presiono y realizo cambios en mi propio control remoto
Tom
Vea el Tutorial de submódulos de Git en el wiki de git.
Greg Bacon

Respuestas:

343
  1. Tienes un proyecto: llámalo MyWebApp que ya tiene un repositorio de github
  2. Desea usar el repositorio jquery en su proyecto
  3. Desea extraer el repositorio jquery en su proyecto como un submódulo .

Los submódulos son muy, muy fáciles de referenciar y usar. Suponiendo que ya tiene MyWebApp configurado como repositorio, desde el terminal emita estos comandos:

cd MyWebApp
git submodule add git://github.com/jquery/jquery.git externals/jquery

Esto creará un directorio llamado externals/jquery* y lo vinculará al repositorio github jquery. Ahora solo necesitamos iniciar el submódulo y clonarle el código:

git submodule update --init --recursive

Ahora debería tener todo el código más reciente clonado en el submódulo. Si el repositorio de jquery cambia y desea extraer el último código, simplemente ejecute el submodule updatecomando nuevamente. Tenga en cuenta: Normalmente tengo una serie de repositorios externos en mis proyectos, por lo que siempre los agrupo en un directorio "externo".

El Pro Git Book en línea tiene buena información sobre submódulos (y git en general) presentados de una manera fácil de leer. Alternativamente, git help submoduletambién dará buena información. O echa un vistazo al Tutorial de submódulos de Git en el wiki de git.

Noté esta entrada de blog que habla sobre submódulos y los compara con svn: mecanismo externo de Subversion: http://speirs.org/blog/2009/5/11/understanding-git-submodules.html

* Como práctica recomendada, siempre debe colocar sus submódulos en su propio directorio, como Externals. Si no lo hace, su directorio de proyecto raíz puede estar muy desordenado muy rápido.

memmons
fuente
44
¡Gran explicación! :) Además, "submódulos de ayuda git" ayuda si quieres un poco más de detalles,
aspectos
2
Gracias, exactamente lo que necesitaba.
MikeSchinkel
1
@Chevi Depende de sus requisitos. En general, agregar un proyecto git como submódulo a su proyecto es una buena solución para proyectos que cambian con frecuencia o aún están en desarrollo. Esto le permite asegurarse fácilmente de que todo el código de terceros en su proyecto esté actualizado. Para el código de terceros que es esencialmente estático (código estable y maduro que probablemente no cambiará mucho de una versión a otra), el uso de un submódulo no proporciona mucho valor.
memmons
2
lo siento, pero en comparación con svn externos, no es tan fácil
Keil
2
@Keil Son dos comandos, git submodule addy git submodule update... No estoy seguro de lo fácil que podría ser.
memmons
24

La mayoría de lo que necesita saber ya ha sido respondido, por lo que no me molestaré en abordarlo, sin embargo, he encontrado una pequeña información que generalmente falta.

Como sabe, "git pull" no actualizará los submódulos, y "actualización de submódulos git" tampoco descargará el último HEAD de esos submódulos.

Para actualizar todos sus submódulos a su última revisión ascendente, puede usar

git submodule foreach git pull

Si a menudo modifica sus submódulos y tiene muchos, entonces "git foreach" será invaluable.

WhyNotHugo
fuente
0

Creo que la respuesta @Hugo podría ser lo que necesita y funciona bien. Así que he encontrado una manera más fácil.

git submodule update --remote

Eso es todo.

Entonces, un flujo de trabajo completo podría ser:

git clone project-with-submodules
git submodule init
git config -l
git submodule update --remote
Dapaldo
fuente