¿Cómo "git clone" incluyendo submódulos?


1996

Estoy tratando de poner un submódulo en un repositorio. El problema es que cuando clono el repositorio principal, la carpeta del submódulo está completamente vacía.

¿Hay alguna manera de hacerlo para que git clone parent_reporealmente ponga datos en la carpeta del submódulo?

Por ejemplo, http://github.com/cwolves/sequelize/tree/master/lib/ , nodejs-mysql-nativeapunta a un submódulo git externo, pero cuando finalizo la compra del sequelizeproyecto, esa carpeta está vacía.


44
Ese comando sería git clone --recurse-submodules --remote-submodules(Q3 2019 Git 2.23): clonará y actualizará los submódulos en un comando. Vea mi respuesta editada a continuación .
VonC

Respuestas:


2976

Con la versión 2.13 de Git y posterior, --recurse-submodulesse puede usar en lugar de --recursive:

git clone --recurse-submodules -j8 git://github.com/foo/bar.git
cd bar

Nota del editor: -j8es una optimización de rendimiento opcional que estuvo disponible en la versión 2.8, y obtiene hasta 8 submódulos a la vez en paralelo - vea man git-clone.

Con la versión 1.9 de Git hasta la versión 2.12 (la -jmarca solo está disponible en la versión 2.8+):

git clone --recursive -j8 git://github.com/foo/bar.git
cd bar

Con la versión 1.6.5 de Git y versiones posteriores, puede usar:

git clone --recursive git://github.com/foo/bar.git
cd bar

Para repos ya clonados o versiones anteriores de Git, use:

git clone git://github.com/foo/bar.git
cd bar
git submodule update --init --recursive

124
¿Hay alguna forma de especificar este comportamiento como predeterminado en su repositorio de git, para que los clonadores menos informados obtengan automáticamente un submódulo inicializado?
NHDaly

11
@NHDaly Lamentablemente, no. (No que yo sepa, al menos.)
Mathias Bynens

66
Y lógicamente pensando en git clone --recursive también poblará cualquier submódulo de un submódulo, ¿verdad?
jayarjo


55
@toszter: ¿es tan sabio? ¿Qué sucede si el repositorio de cartera necesita una versión de un submódulo que no lo es master?
Gauthier

498

Debe hacer dos cosas antes de que se complete un submódulo:

git submodule init 
git submodule update

8
Tenía miedo de eso ... no tiene ningún sentido ya que estás revisando un proyecto parcial en ese caso. Entiendo que las actualizaciones de submódulos no son automáticas, pero ¿por qué la versión enlazada no se extrae automáticamente? ¿Hay alguna forma de forzarlo? Tengo un proyecto con 3 niveles de submódulos y parece absurdo tener que atravesar tan lejos solo para hacer un pago.
Mark

11
Lea la git-submodule(1)página de manual ( kernel.org/pub/software/scm/git/docs/git-submodule.html ). Descubrirá que git submodule updateadmite un buen parámetro llamado --recursive.
joschi

95
¿Por qué no hacer las dos cosas en un solo comando? git submodule update --init(También vea mi respuesta ).
Mathias Bynens

99
Creo que es mejor responder la pregunta con estos dos comandos. Explica mejor cómo realizar la tarea.
schmijos

66
@MathiasBynens Una máquina en la que acabo de iniciar sesión solo tiene git 1.5.5.6, que aparentemente no admite la instrucción abreviada, pero la admite como dos comandos.
Jack Poulson

225

Git 2.23 (Q3 2019): si desea clonar y actualizar los submódulos a su última revisión:

git clone --recurse-submodules --remote-submodules

Si solo desea clonarlos en su SHA1 grabado:

git clone --recurse-submodules

Vea abajo.


Respuesta original 2010

Como joschi menciona en los comentarios, git submoduleahora admite la --recursiveopción (Git1.6.5 y más).

Si --recursivese especifica, este comando volverá a aparecer en los submódulos registrados y actualizará los submódulos anidados.

Consulte Trabajar con submódulos git de forma recursiva para la parte init.
Ver git submoduleexplicado para más.

Con la versión 1.6.5 de git y posteriores, puede hacer esto automáticamente clonando el superproyecto con la –-recursiveopción:

git clone --recursive git://github.com/mysociety/whatdotheyknow.git

Actualización 2016, con git 2.8: consulte " ¿Cómo acelerar / paralelizar las descargas de submódulos git usando git clone --recursive? "

Puede iniciar la recuperación del submódulo utilizando múltiples subprocesos, en paralelo.
Por instancias:

git fetch --recurse-submodules -j2

¡Aún mejor, con Git 2.23 (Q3 2019), puede clonar y pagar el submódulo a su rama de seguimiento en un solo comando!

Ver commit 4c69101 (19 de mayo de 2019) por Ben Avison ( bavison) .
(Fusionada por Junio ​​C Hamano - gitster- en commit 9476094 , 17 jun 2019)

clone: agregar --remote-submodules bandera

Cuando se usaba git clone --recurse-submodulesanteriormente no había forma de pasar un--remote interruptor al git submodule updatecomando implícito para cualquier caso de uso en el que desea que los submódulos se verifiquen en su rama de seguimiento remoto en lugar de con el SHA-1 registrado en el superproyecto.

Este parche rectifica esta situación.
En realidad pasa --no-fetchagit submodule update así con el argumento de que el submódulo apenas ha sido clonado, por lo que ir a buscar desde el control remoto de nuevo sólo sirve para retrasar las cosas.

Eso significa:

--[no-]remote-submodules:

Todos los submódulos que se clonan utilizarán el estado de la rama de seguimiento remoto del submódulo para actualizar el submódulo, en lugar del SHA-1 registrado del superproyecto. Equivalente a pasar --remotea git submodule update.


3
Así que le tomó a Git 14 años comenzar a agregar soporte adecuado para submódulos, ¿eh? ¡Gracias por la actualización! ¿Qué sucede si ya tengo un clon del repositorio principal sin submódulos y sin un SHA1 grabado, y quiero obtener la última versión de cada submódulo? ¿Es factible?
Violet Giraffe

1
@VioletGiraffe Si ese repositorio clonado tiene submódulos, "ha grabado SHA1". Y git submodule update --init --recursive --remotedebe actualizarlos a la última confirmación de su respectiva sucursal. (Ej: stackoverflow.com/a/56981834/6309 )
VonC

1
Permítanme aclarar con un ejemplo: tengo un proyecto de plantilla en Github que usa submódulos, e incluso cometí revisiones específicas de los submódulos en este repositorio de plantillas. Pero cuando creo un nuevo proyecto a partir de este repositorio, ninguno de los comandos que enumeró (ni clone --recurse-submodules --remote-submodulestampoco submodule update --init --recursive --remote) me permite buscar los subrepos. Todo lo que obtengo es un archivo .gitmodules, y no pude encontrar ninguna manera de iniciar los subrepos que no sea clonarlos manualmente uno por uno. Al menos me gustaría tener un guión para hacerlo submodule foreach...
Violet Giraffe

Si conoce una solución, le haría una pregunta por separado que podría responder. Aquí está el repositorio de prueba que no puedo encontrar otra manera de iniciar que no sea a mano: github.com/VioletGiraffe/TEST
Violet Giraffe

@VioletGiraffe Eso es porque ha agregado y comprometido los .gitmodules pero no el gitlink ( stackoverflow.com/a/16581096/6309 , entradas especiales en el índice: stackoverflow.com/a/19354410/6309 ) Aquí hay un repositorio que hace tener el gitlink apropiado registrado: github.com/tiagomazzutti/antlr4dart
VonC

110

[Respuesta rápida]

Puede usar este comando para clonar su repositorio con todos los submódulos:

git clone --recursive YOUR-GIT-REPO-URL

O si ya ha clonado el proyecto, puede usar:

git submodule init
git submodule update

33

Si su submódulo se agregó en una rama, asegúrese de incluirlo en su comando de clonación ...

git clone -b <branch_name> --recursive <remote> <directory>

Esto era más parecido a lo que estaba buscando ... pero los submódulos enumeran su rama como 'separada'. :(
AceFunk

28

Prueba esto:

git clone --recurse-submodules

Automáticamente extrae los datos del submódulo suponiendo que ya haya agregado los submódulos al proyecto principal.


37
Tenga en cuenta que --recurse-submodulesy --recursiveson alias equivalentes .
Joel Purra el

@SuperUberDuper en ese caso, puede hacer lo git submodule update --init --recursiveque se explica en esta respuesta
Enrico

25

Creo que puedes seguir 3 pasos:

git clone
git submodule init
git submodule update

21

respuesta tardía

// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORY
git clone --recursive https://USERNAME@bitbucket.org/USERNAME/REPO.git DESTINATION_DIR

Como acabo de pasar una hora entera jugando con un amigo: incluso si tiene derechos de administrador en BitBucket, siempre clone el repositorio ORIGINAL y use la contraseña del propietario del repositorio. Molesto al descubrir que te encontraste con esta trampa minera: P


Eso es exactamente con lo que estoy tratando. Entonces, ¿estás diciendo que cualquiera que necesite desarrollarse en un repositorio de bitbucket que tenga submódulos debe usar las credenciales del creador del repositorio? Blech
jsleuth

@jsleuth Parece que sí, apesta MUCHO TIEMPO ... y lo sé.
Kaiser

Eso suena como un error. ¿Lo reportaste a Bitbucket?
Mathias Bynens

@MathiasBynens ¿Te has topado con este problema? Es un año y medio después y en realidad no sé si este sigue siendo el caso.
Kaiser

44
No responde descriptivamente a la pregunta de los OP, pero detalla un error no relacionado en Bitbucket; que, por cierto, podría acortarse para "usar la autenticación de clave SSH".
Treffynnon

18

Pruebe esto para incluir submódulos en el repositorio de git.

git clone -b <branch_name> --recursive <remote> <directory>

o

git clone --recurse-submodules

18

Puede usar la --recursivebandera al clonar un repositorio. Este parámetro obliga a git a clonar todos los submódulos definidos en el repositorio.

git clone --recursive git@repo.org:your_repo.git

Después de la clonación, a veces se pueden cambiar las ramas de los submódulos, así que ejecute este comando después de esto:

git submodule foreach "git checkout master"

17

[Respuesta rápida]

Después de clonar el repositorio principal (que contenía un repositorio de submódulo), haga lo siguiente:

git submodule update --init --recursive

11

La recuperación paralela de submódulos tiene como objetivo reducir el tiempo requerido para recuperar los repositorios y todos sus submódulos relacionados al permitir la recuperación de múltiples repositorios a la vez. Esto se puede lograr utilizando la nueva opción --jobs, por ejemplo:

git fetch --recurse-submodules --jobs=4

Según el equipo de Git, esto puede acelerar sustancialmente la actualización de repositorios que contienen muchos submódulos. Al usar --recurse-submodules sin la nueva opción --jobs, Git buscará los submódulos uno por uno.

Fuente: http://www.infoq.com/news/2016/03/git28-released


8

Tuve el mismo problema para un repositorio de GitHub. A mi cuenta le faltaba la clave SSH. El proceso es

  1. Generar clave SSH
  2. Agregar una nueva clave SSH a su cuenta de GitHub

Luego, puede clonar el repositorio con submódulos (git clone --recursive YOUR-GIT-REPO-URL )

o

Ejecute git submodule inity git submodule updateobtenga submódulos en un repositorio ya clonado.


Sí, eso es un Permission denied (publickey). fatal: Could not read from remote repository.error
Ender

5

Prueba esto.

git clone -b <branch_name> --recursive <remote> <directory>

Si ha agregado el submódulo en una rama, asegúrese de agregarlo al comando clonar.


5

Si es un proyecto nuevo, simplemente puede hacer lo siguiente:

$ git clone --recurse-submodules https://github.com/chaconinc/YourProjectName 

Si ya está instalado que:

$ cd YourProjectName (for the cases you are not at right directory) 
$ git submodule init
$ git submodule update
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.