Est-il possible qu'un sous-module git soit composé de plusieurs autres sous-modules git, et le super git repo de récupérer le contenu de chaque sous-module?
J'ai essayé de le faire en utilisant l'approche évidente/naïve de créer un dépôt git contenant plusieurs sous-modules.
Ensuite, ajoutez ce dépôt git à un autre dépôt git en tant que sous-module.
Ensuite, essayez d'extraire du répertoire racine du super git repo par git submodule init
et alors git submodule update
. Mais cela ne parvient pas à récupérer les sous-sous-modules.
Comme mentionné dans Ajouter rétrospectivement - récursif à un dépôt git
git submodule update --init --recursive
devrait marcher.
Comme Sridhar commentaires ci-dessous, de Git1.6.5 +, git clone --recursive
est désormais l'alternative officielle, décrite dans:
git clone --submodule
"--recursive
à un dépôt git "alias $ git config --global alias.cloner = 'clone --recursive'
, ce qui évite de masquer la normale git clone
commande)inamiy correctement souligne le git submodule update --init --recursive
commande, introduite dans commit b13fd5c , encore dans git1.6.5, par Johan Herland (jherland
) .
Et IceFire ajoute dans les commentaires :
Si vous souhaitez retirer un seul sous-module d'un sous-module, alors
git submodule update --init <submoduleName>
est la voie à suivre.
(ancienne réponse originale)
Selon le page de manuel
git submodule update --recursive
devrait mettre à jour tous les sous-modules imbriqués. Mais la partie init n'est peut-être pas récursive.
En fonction de votre version de Git, vous pourriez revenir à une approche plus "scripting", avec cet article Mise à jour récursive des sous-modules Git qui permet un init et une mise à jour récursifs:
#!/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);
}