Git submodule внутри подмодуля (вложенные подмодули) - PullRequest
123 голосов
/ 08 октября 2009

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

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

Затем добавление этого git-репо в другое git-репо в качестве подмодуля.

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

Ответы [ 2 ]

177 голосов
/ 03 июля 2011

Как упомянуто в Ретроспективно добавить --recursive к git-репо

git submodule update --init --recursive

должно работать.

52 голосов
/ 08 октября 2009

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

inamiy правильно указывает команда git submodule update --init --recursive, введенная в commit b13fd5c , снова в git1.6.5, Йохан Херланд (jherland) .

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

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


(старый оригинальный ответ)

Согласно справочнику

 git submodule update --recursive

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

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

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