2009-10-08 23 views
109

¿Es posible que un submódulo de git esté hecho de varios otros submódulos de git, y el super git repo para recuperar los contenidos de cada submódulo?Submódulo de Git dentro de un submódulo (submódulos anidados)

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

Luego agregando este repositorio git a otro repositorio git como submódulo.

Luego, tratando de extraer desde el directorio raíz del super git repo por git submodule init y luego git submodule update. Pero esto no logra recuperar los submódulos secundarios.

Respuesta

149

Como se mencionó en Retrospectively add --recursive to a git repo

git submodule update --init --recursive 

debería funcionar.

+8

Esto funcionó para mí. Tenga en cuenta que pensé erróneamente que 'git submodule init; actualización del submódulo git --recursive' era sinónimo de lo anterior, pero no lo es. – jsdalton

+0

+1 Me gusta mucho mejor que lo que estaba usando: git submodule foreach git submódulo init ... luego git submodule update --recursive –

+0

Lamentablemente esto no funcionó para mí. Sin errores, sin mensajes, nada. –

49

Como Sridhar comentarios a continuación, a partir de Git1.6.5 +, git clone --recursive es ahora la alternativa oficial, se describe en:

inamiy correctamente points out el comando git submodule update --init --recursive, introducido en commit b13fd5c, nuevamente en git1.6.5, por Johan Herland (jherland).

Y añade IceFirein the comments:

Si desea obtener sólo un submódulo de un submódulo, entonces
git submodule update --init <submoduleName> es el camino a seguir.


(mayor respuesta original)

De acuerdo con la manual page

git submodule update --recursive 

debe actualizar ninguna submódulos anidados. Pero la parte init puede no ser recursiva.

Dependiendo de la versión de Git, se podría caer de nuevo a un enfoque más "scripting", con este artículo Recursively Updating Git Submodules que permite recursiva actualización init y:

#!/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); 
} 
+1

¿No es suficiente 'git clone --recursive'? –

+0

@Sridhar: es, para clonar, como se menciona en http://stackoverflow.com/questions/3796927/git-clone-submodule y http://stackoverflow.com/questions/4251940/retrospectively-add-recursive-to -a-git-repo/4261001 # 4261001, de Git1.6.5 y posterior. He editado mi respuesta para reflejar eso. – VonC

+0

Nota: Si desea consultar solo un submódulo de un submódulo, entonces 'git submodule update --init ' es el camino a seguir; Llegué aquí al buscar esta respuesta – IceFire

Cuestiones relacionadas