git - submodule - submodulos
Submódulo de Git dentro de un submódulo(submódulos anidados) (2)
¿Es posible que un submódulo git esté formado por varios otros submódulos de git y el super git repo para obtener los contenidos de cada submódulo?
Intenté hacer esto usando el enfoque obvio / ingenuo de crear un repo git que contenga varios submódulos.
Luego agregando este git repo a otro git repo como un submódulo.
Luego, tratando de extraer del directorio raíz del repo super git mediante el git submodule init
y luego la git submodule update
. Pero esto no logra recuperar los submódulos secundarios.
Como comenta Sridhar continuación, desde Git1.6.5 +, git clone --recursive
es ahora la alternativa oficial, descrita en:
- "
git clone --submodule
" - " Retrospectivamente add
--recursive
a un git repo "
(conalias $ git config --global alias.cloner = ''clone --recursive''
, que evita sombrear el comandogit clone
normal)
señala correctamente la git submodule update --init --recursive
, introducido en commit b13fd5c , nuevamente en git1.6.5, por Johan Herland ( jherland
) .
Y IceFire agrega en los comentarios :
Si desea consultar solo un submódulo de un submódulo, entonces
git submodule update --init <submoduleName>
es el camino a seguir.
(respuesta original más antigua)
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 "de secuencias de comandos", con este artículo Actualización recursiva de submódulos de Git, que permite el inicio y la actualización recursivos:
#!/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);
}
Como se menciona en Retrospectively add --recursive a un git repo
git submodule update --init --recursive
Deberia trabajar.