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.


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.


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.