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

marca
fuente
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
Mathias Bynens
fuente
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
3
@NHDaly parece que no: stackoverflow.com/questions/4251940/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
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
LiraNuna
fuente
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.

VonC
fuente
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
Javier C.
fuente
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>
Mars Redwyne
fuente
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.

nweiler
fuente
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
muhammad ali e
fuente
21

respuesta tardía

// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORY
git clone --recursive https://[email protected]/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

emperador
fuente
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
radhey shyam
fuente
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 [email protected]: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"
Ahmad Azimi
fuente
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
Benyamin Jafari
fuente
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

Long Nguyen
fuente
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.

Error fatal
fuente
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.

Himeshika96
fuente
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
nzrytmn
fuente