Submódulo Git dentro de un submódulo (submódulos anidados)

137

¿Es posible que un submódulo git esté hecho de varios otros submódulos git, y que el supergit repo obtenga el contenido de cada submódulo?

He intentado hacer esto usando el enfoque obvio / ingenuo de crear un repositorio git que contenga varios submódulos.

Luego, agregue este repositorio de git a otro repositorio de git como submódulo.

Luego intenta extraer desde el directorio raíz del super git repo por git submodule inity luego git submodule update. Pero esto no puede recuperar los sub-submódulos.

primer respondedor
fuente
Le sugiero que use TortoiseGit: úselo en su raíz y luego solicite que actualice todos los submódulos con Initialize, Recursive, Force marcado.
Serup

Respuestas:

211

Como se menciona en Retrospectivamente, agregue --recursive a un repositorio git

git submodule update --init --recursive

Deberia trabajar.

inamiy
fuente
13
Esto funcionó para mí. Tenga en cuenta que erróneamente pensé que git submodule init; git submodule update --recursiveera sinónimo de lo anterior, pero no lo es.
jsdalton
+1 Me gusta mucho más de lo que estaba usando: git submodule foreach git submodule init ... luego git submodule update --recursive
Joseph DeCarlo
Lamentablemente esto no funcionó para mí. Sin errores, sin mensajes, nada.
Luís de Sousa
¿Cómo se actualizan estos repositorios totalmente anidados? Cuando paso la --initbandera, los submódulos, dentro de uno de mis submódulos, simplemente se inicializan a versiones antiguas, no a las más actuales.
Yoaquim
Lo hago git submodule foreach git pull origin master, y funciona parcialmente: los submódulos se actualizan, pero a veces HEADse separa y para los submódulos dentro de los submódulos, no puedo confirmar los cambios de mi submódulo directo porque tiene "contenido modificado" no "nuevos compromisos" (ya que sus propios submódulos tienen "nuevos commits" y se actualizan).
Yoaquim
55

Como comenta Sridhar a continuación, desde Git1.6.5 +, git clone --recursiveahora es la alternativa oficial, descrita en:

inamiy señala correctamente el git submodule update --init --recursivecomando, introducido en commit b13fd5c , nuevamente en git1.6.5, por Johan Herland ( jherland) .

Y IceFire agrega en los comentarios :

Si desea pagar solo un submódulo de un submódulo, entonces este
git submodule update --init <submoduleName>es el camino a seguir.


(respuesta original anterior)

De acuerdo con la página del manual

 git submodule update --recursive

debería actualizar cualquier submódulo anidado. Pero la parte init puede no ser recursiva.

Dependiendo de su versión de Git, podría recurrir a un enfoque más "scripting", con este artículo Actualización periódica de submódulos de Git que permite el inicio y la actualización recursiva:

#!/usr/bin/perl

use strict;
use Cwd;

init_and_update();

exit;

sub init_and_update
{
    my $start_path = cwd();

    my %paths;
    my $updated;

    do
    {
        my $data = `find . -name '.gitmodules'`;
        chomp($data);

        $data =~ s/\/\.gitmodules//g;

        foreach my $path (split(/\n/, $data))
        {
            $paths{$path} = '' if($paths{$path} eq '');
        }

        $updated = 0;

        foreach my $path (sort keys %paths)
        {
            if($paths{$path} eq '')
            {
                chdir($path);
                `git submodule init 2>&1`;
                `git submodule update 2>&1`;
                chdir($start_path);

                if($ARGV[0] eq '--remove-gitmodules')
                {
                    unlink("$path/.gitmodules");
                }

                $paths{$path} = 1;

                $updated++;
            }
        }
    } while($updated);
}
VonC
fuente
1
¿No es git clone --recursivesuficiente?
Sridhar Ratnakumar
@Sridhar: es, para clonar, como se menciona en stackoverflow.com/questions/3796927/git-clone-submodule y stackoverflow.com/questions/4251940/… , de Git1.6.5 y posterior. He editado mi respuesta para reflejar eso.
VonC
Nota: Si desea pagar solo un submódulo de un submódulo, entonces este git submodule update --init <submoduleName>es el camino a seguir; Llegué aquí cuando buscaba esta respuesta
IceFire
1
@IceFire Gracias. He incluido tu comentario en la respuesta para mayor visibilidad.
VonC