git git-submodules git-clone cloning git-remote

¿Cómo obtengo `git clone--recursive` para recrear los remotos y las ramas de los submódulos?



git-submodules git-clone (1)

Tengo un proyecto con un puñado de submódulos. Muchos de ellos se clonan desde un fork de GitHub al que he agregado una rama para mis mods personalizados. Una configuración típica es así:

En la carpeta local: MyProject1 / Frameworks / SomeAmazingRepo /

$ git branch -vva *my-fork 123456 [my-fork/my-fork] Latest commit msg from fork master abcdef [origin/master] Latest commit msg from original repo remotes/my-fork/my-fork 123456 [my-fork/my-fork] Latest commit msg from fork remotes/my-fork/master abcdef [origin/master] Latest commit msg from original repo remotes/origin/HEAD -> origin/master remotes/origin/master abcdef [origin/master] Latest commit msg from original repo $ git remote -v my-fork [email protected]:MyUser/SomeAmazingRepo.git (fetch) my-fork [email protected]:MyUser/SomeAmazingRepo.git (push) origin git://github.com/OriginalOwner/SomeAmazingRepo.git (fetch) origin git://github.com/OriginalOwner/SomeAmazingRepo.git (push)

git clone --recursive mi proyecto para comenzar un nuevo proyecto derivado y, cuando comienza a repuntar, emite un error que dice que no puede encontrar las confirmaciones almacenadas para estos repositorios. Tras la inspección, parece que los controles remotos no se han agregado y la rama se deja (vacía) en el maestro ...

En la carpeta local: MyProject2 / Frameworks / SomeAmazingRepo /

$ git branch -vva *master abcdef [origin/master] Latest commit msg from original repo remotes/origin/HEAD -> origin/master remotes/origin/master abcdef [origin/master] Latest commit msg from original repo $ git remote -v origin git://github.com/OriginalOwner/SomeAmazingRepo.git (fetch) origin git://github.com/OriginalOwner/SomeAmazingRepo.git (push)

El único remedio es ir y agregar los controles remotos manualmente a todos los repositorios (muy tedioso).

Existe un problema similar en los casos en que hay dos ramas de seguimiento como anteriormente, pero solo una remota (origen => mi horquilla de github). En estos casos, encuentra la confirmación y la verifica, pero no vuelve a crear la rama de seguimiento, lo que deja una confirmación "colgante" ... ¡muy aterradora ya que no le advierte!

¿Cómo puedo clonar mi proyecto para que recrea de manera confiable los remotos y las ramas de los submódulos?


git clone --recursive es equivalente a la git submodule update --init --recursive .

Y una actualización de submódulo de git solo verificará el SHA1 grabado (grabado en el repositorio principal):

Actualice los submódulos registrados, es decir, clone los submódulos que faltan y verifique la confirmación especificada en el índice del repositorio que contiene.
Esto hará que los submódulos HEAD se separen .

2012: Por lo tanto, no es común encontrar una rama activa en un submódulo.
Un git submodule foreach ''git checkout master'' puede establecer al menos la rama maestra (si está seguro de que todos los SHA1 registrados debían formar parte de una rama ''maestra'' para cada submódulo.

2013-2014: puede configurar su archivo .gitmodules para especificar una sucursal a pagar en su submódulo .
Consulte " ¿Cómo actualizo mis submódulos de git de sucursales específicas? "

cd /path/to/your/parent/repo git config -f .gitmodules submodule.<path>.branch <branch>

Cualquier control remoto que agregue localmente en un submódulo, como my-fork , no se registra en el repositorio principal.
Por lo tanto, cuando vuelva a clonar el repositorio principal, se inicializarán y actualizarán los submódulos tal como están registrados en el archivo .gitmodules (puede cambiar esa dirección , pero solo una está asociada con cada submódulo).
Si tiene otra dirección remota para asociar a cada submódulo, necesita una secuencia de comandos para automatizar el proceso.

Como se explica en "La verdadera naturaleza del submódulo ", un submódulo está principalmente allí para registrar / acceder a un punto fijo en la historia.
Puede desarrollarse directamente dentro de un submódulo, pero debe ir allí y hacer la rama correcta y / o agregar los controles remotos correctos.

emite un error al afirmar que no puede encontrar las confirmaciones almacenadas para estos repositorios.

Cada vez que realice un compromiso en un submódulo, deberá:

  • .gitmodules en el .gitmodules remoto asociado (es decir, el que está registrado en los .gitmodules del repositorio principal)
  • volver al repositorio de los padres y cometer dicho padre.

Pero:

Si ha presionado a '' my-fork '' mientras que el repositorio remoto asociado de ese submódulo no era '' my-fork '' ... entonces el siguiente clon no podrá verificar ese compromiso de submódulo.

Actualización agosto 2014 (Git 2.1)

Ver commit 9393ae7 por Matthew Chen ( charlesmchen ) :

submódulo: documento " sync --recursive "

El comando " git submodule sync " admite el indicador --recursive , pero la documentación no menciona esto.
Esa bandera es útil, por ejemplo, cuando se cambia un control remoto en un submódulo de un submódulo.