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

137

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

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

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

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

firstresponder
источник
Я предлагаю вам использовать TortoiseGit - используйте его в своем корне, а затем попросите обновить все подмодули с установленным параметром Initialize, Recursive, Force!
serup

Ответы:

211

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

git submodule update --init --recursive

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

inamiy
источник
13
Это сработало для меня. Обратите внимание, что я ошибочно думал, что это git submodule init; git submodule update --recursiveбыло синонимом вышесказанного, но это не так.
jsdalton
+1 Мне нравится это намного лучше, чем то, что я использовал: подмодуль git foreach git submodule init ... затем обновление подмодуля git --recursive
Joseph DeCarlo
К сожалению, это не сработало для меня. Нет ошибок, нет сообщений, ничего.
Луис де Соуза
Как вы обновляете эти полностью вложенные репозитории? Когда я передаю --initфлаг, подмодули внутри одного из моих подмодулей просто инициализируются старыми версиями, а не самыми последними.
Йоаким
Я делаю git submodule foreach git pull origin master, и это работает частично: подмодули обновляются, но иногда они HEADотсоединяются, и для подмодулей внутри подмодулей я не могу зафиксировать изменения моего прямого подмодуля, потому что он имеет «измененный контент», а не «новые коммиты» (поскольку его собственные подмодули имеют "новые коммиты" и обновляются).
Йоаким
55

Как Шридхар комментарии ниже, от 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);
}
VonC
источник
1
Не git clone --recursiveдостаточно?
Шридхар Ратнакумар
@Sridhar: это для клонирования, как упомянуто в stackoverflow.com/questions/3796927/git-clone-submodule и stackoverflow.com/questions/4251940/… , из Git1.6.5 и новее. Я отредактировал свой ответ, чтобы отразить это.
VonC
Примечание. Если вы хотите оформить заказ только на один субмодуль субмодуля, то git submodule update --init <submoduleName>есть путь; Я попал сюда при поиске этого ответа
IceFire
1
@IceFire Спасибо. Я включил ваш комментарий в ответ для большей наглядности.
VonC