web-dev-qa-db-fra.com

Sous-module Git à l'intérieur d'un sous-module (sous-modules imbriqués)

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.

126
firstresponder

Comme mentionné dans Ajouter rétrospectivement - récursif à un dépôt git

git submodule update --init --recursive

devrait marcher.

184
inamiy

Comme Sridhar commentaires ci-dessous, de Git1.6.5 +, git clone --recursive est désormais l'alternative officielle, décrite dans:

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);
}
52
VonC