Git submódulo dentro de un submódulo (submódulos anidados)
-
20-09-2019 - |
Pregunta
¿Es posible que un submódulo git a ser de varios otros submódulos git, y el repositorio Git súper para ir a buscar el contenido de cada submódulo?
He tratado de hacer esto utilizando el enfoque obvio / ingenua de la creación de un repositorio git que sostiene varios submódulos.
A continuación, la adición de este repositorio git a otro repositorio git como un submódulo.
A continuación, intentar tirar desde el directorio raíz de la cesión temporal súper git por git submodule init
y luego git submodule update
. Pero esto no funciona a buscar a los sub-submódulos.
Solución
Como se mencionó en Retrospectivamente añadir --recursive a un repositorio git
git submodule update --init --recursive
debería funcionar.
Otros consejos
Sridhar comentarios a continuación, a partir de Git1.6.5 +, git clone --recursive
es ahora la alternativa oficial, se describe en:
- "
git clone --submodule
" - " añadir Retrospectivamente
--recursive
a un repositorio git "
(Con laalias $ git config --global alias.cloner = 'clone --recursive'
, lo que evita que cubrían el comando normal degit clone
)
inamiy , a cabo el comando git submodule update --init --recursive
, introducido en cometer b13fd5c, de nuevo en GIT1. 6,5, por Johan Herland (jherland
) .
IceFire añade en los comentarios :?
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 de página manual
git submodule update --recursive
debería actualizar ninguna submódulos anidados. Pero la parte de inicio no puede ser recursivo.
Dependiendo de la versión de Git, se podría caer de nuevo a un enfoque más "scripting", con este artículo recursivamente actualización de Git submódulos 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);
}