Підмодуль Git всередині підмодуля (вкладені підмодулі)


137

Чи можливо, щоб підмодуль git був виготовлений з кількох інших підмодулів git, а супер git repo отримав вміст для кожного підмодуля?

Я намагався це зробити, використовуючи очевидний / наївний підхід створення git repo, що містить кілька підмодулів.

Потім додайте це git repo до іншого git repo як підмодуль.

Потім намагається витягнути з кореневого каталогу супер мерзотника репо по , git submodule initа потім git submodule update. Але це не вдається отримати підмодулі.


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

Відповіді:


211

Як згадується в Ретроспективно, додайте - рекурсивну до git repo

git submodule update --init --recursive

повинен працювати.


13
Це працювало для мене. Зауважте, що я помилково подумав, що це git submodule init; git submodule update --recursiveбуло синонімом вищезазначеного, але це не так.
jsdalton

+1 Мені це подобається набагато краще, ніж те, що я використовував: git submodule foreach git submodule init ... тоді оновлення підмодуля git --рекурсивне
Джозеф Декарло

На жаль, це не спрацювало для мене. Ні помилок, ні повідомлень, нічого.
Luís de Sousa

Як ви оновлюєте тези повністю вкладених репостів? Коли я передаю --initпрапор, підмодулі в одному з моїх підмодулів просто ініціалізуються до старих версій, а не до самих поточних.
йоакім

Я так git submodule foreach git pull origin masterі працює частково: субмодули оновлюються, але іноді вони HEADвідриваються, а для підмодулів у межах підмодулів я не можу вносити зміни до свого прямого підмодулю, оскільки він має "змінений вміст", а не "нові коміти" (оскільки його власні підмодулі мають "нові коміти" та оновлюються).
йоакім

55

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

Інамій правильно вказує на git submodule update --init --recursiveкоманду, введену в команді b13fd5c , знову ж таки в git1.6.5, Йоханом Герланд ( jherland) .

І IceFire додає в коментарях :

Якщо ви хочете перевірити лише один підмодуль підмодуля, то
git submodule update --init <submoduleName>це шлях.


(старіша оригінальна відповідь)

Відповідно до сторінки керівництва

 git submodule update --recursive

слід оновити будь-які вкладені підмодулі. Але частина init може бути не рекурсивною.

Залежно від вашої версії 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);
}

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.