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

137

Est-il possible qu'un sous-module git soit composé de plusieurs autres sous-modules git et que le super git repo récupère le contenu de chaque sous-module?

J'ai essayé de le faire en utilisant l'approche évidente / naïve de création d'un repo git contenant plusieurs sous-modules.

Ensuite, ajoutez ce repo git à un autre repo git en tant que sous-module.

Ensuite, en essayant d'extraire du répertoire racine du repo super git par git submodule initet ensuite git submodule update. Mais cela ne parvient pas à récupérer les sous-sous-modules.

premier répondeur
la source
Je vous suggère d'utiliser TortoiseGit - utilisez-le dans votre racine, puis demandez-lui de mettre à jour tous les sous-modules avec Initialize, Recursive, Force coché!
serup

Réponses:

211

Comme mentionné dans Retrospectively add --recursive to a git repo

git submodule update --init --recursive

devrait marcher.

inamiy
la source
13
Cela a fonctionné pour moi. Notez que j'ai pensé à tort que cela git submodule init; git submodule update --recursiveétait également le cas ci-dessus, mais ce n'est pas le cas.
jsdalton
+1 J'aime bien mieux que ce que j'utilisais: git submodule foreach git submodule init ... puis git submodule update --recursive
Joseph DeCarlo
Malheureusement, cela n'a pas fonctionné pour moi. Pas d'erreurs, pas de messages, rien.
Luís de Sousa
Mais comment mettre à jour ces dépôts entièrement imbriqués? Lorsque je passe le --initdrapeau, les sous-modules, dans l'un de mes sous-modules, sont simplement initialisés avec les anciennes versions, pas les plus récentes.
yoaquim
Je fais git submodule foreach git pull origin master, et cela fonctionne partiellement: les sous-modules sont mis à jour, mais parfois ils HEADse détachent et pour les sous-modules dans les sous-modules, je ne peux pas valider les modifications de mon sous-module direct car il a un "contenu modifié" et non de "nouveaux commits" (puisque ses propres sous-modules ont "new commits" et sont mis à jour).
yoaquim
55

Comme Sridhar le commente ci-dessous, à partir de Git1.6.5 +, git clone --recursiveest maintenant l'alternative officielle, décrite dans:

inamiy correctement signale la git submodule update --init --recursivecommande, introduit en commettre b13fd5c , encore une fois dans git1.6.5, par Johan Herland ( jherland) .

Et IceFire ajoute dans les commentaires :

Si vous souhaitez commander un seul sous-module d'un sous-module, alors
git submodule update --init <submoduleName>c'est la voie à suivre.


(réponse originale plus ancienne)

Selon la page de manuel

 git submodule update --recursive

devrait mettre à jour tous les sous-modules imbriqués. Mais la partie init peut ne pas être récursive.

En fonction de votre version de Git, vous pouvez revenir à une approche plus "scripting", avec cet article Mise à jour récursive des sous-modules Git qui permet une initialisation et une mise à jour récursives:

#!/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);
}
VonC
la source
1
N'est-ce pas git clone --recursivesuffisant?
Sridhar Ratnakumar
@Sridhar: c'est, pour le clonage, comme mentionné dans stackoverflow.com/questions/3796927/git-clone-submodule et stackoverflow.com/questions/4251940/… , à partir de Git1.6.5 et versions ultérieures. J'ai modifié ma réponse pour refléter cela.
VonC le
Remarque: si vous souhaitez retirer un seul sous-module d'un sous-module, alors git submodule update --init <submoduleName>c'est la voie à suivre; Je suis arrivé ici en cherchant cette réponse
IceFire
1
@IceFire Merci. J'ai inclus votre commentaire dans la réponse pour plus de visibilité.
VonC