Git подмодуль внутри подмодуля (вложенные подмодули)

Возможно ли, чтобы подмодуль git был сделан из нескольких других подмодулей git, а супер git репо, чтобы получить содержимое для каждого подмодуля?

Я попытался сделать это, используя очевидный/наивный подход к созданию репозитория git, содержащего несколько подмодулей.

Затем добавив этот git репо к другому репо git как подмодуль.

Затем попытаемся извлечь из корневого каталога супер git репо git submodule init, а затем git submodule update. Но это не позволяет получить под-подмодули.

Ответ 2

Как Sridhar ниже, из Git1.6.5 +, git clone --recursive теперь является официальной альтернативой, описанной в:

inamiy правильно указывает команду git submodule update --init --recursive, введенную в зафиксировать b13fd5c, снова в git1.6.5, Johan Herland (jherland).

И IceFire добавляет в комментариях:

Если вы хотите проверить только один подмодуль подмодуля, тогда git submodule update --init <submoduleName> - путь.


(более старый исходный ответ)

В соответствии с справочной страницей

 git submodule update --recursive

должен обновлять любые вложенные подмодули. Но часть init может не быть рекурсивной.

В зависимости от вашей версии Git вы можете вернуться к более "сценарийному" подходу, с помощью этой статьи Рекурсивно обновить git Submodules, который позволяет рекурсивно инициализировать и обновлять:

#!/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);
}