Moduł podrzędny Git w module podrzędnym (moduły podrzędne zagnieżdżone)

137

Czy możliwe jest, aby podmoduł git składał się z kilku innych podmodułów git, a repozytorium super git pobierało zawartość każdego podmodułu?

Próbowałem to zrobić, używając oczywistego / naiwnego podejścia do tworzenia repozytorium git zawierającego kilka podmodułów.

Następnie dodajemy to repozytorium git do innego repozytorium git jako podmoduł.

Następnie próbujesz pobrać z katalogu głównego repozytorium super git do git submodule initi wtedy git submodule update. Ale to nie pozwala na pobranie podmodułów.

pierwszy korespondent
źródło
Proponuję użyć TortoiseGit - użyj go w swoim katalogu głównym, a następnie poproś o aktualizację wszystkich modułów podrzędnych z zaznaczoną opcją Inicjalizuj, Rekurencyjnie, Wymuś!
serup

Odpowiedzi:

211

Jak wspomniano w retrospektywnym dodaniu --recursive do repozytorium git

git submodule update --init --recursive

powinno działać.

inamiy
źródło
13
To zadziałało dla mnie. Zauważ, że błędnie myślałem, że jest git submodule init; git submodule update --recursiveto synonim powyższego, ale tak nie jest.
jsdalton
+1 Podoba mi się to znacznie lepiej niż to, z czego korzystałem: git submodule foreach git submodule init ... następnie git submodule update --recursive
Joseph DeCarlo
Niestety to nie zadziałało dla mnie. Żadnych błędów, żadnych wiadomości, nic.
Luís de Sousa,
Jak jednak zaktualizować te w pełni zagnieżdżone repozytoria? Kiedy przekazuję --initflagę, moduły podrzędne w jednym z moich modułów podrzędnych są po prostu inicjalizowane do starszych wersji, a nie do najnowszych.
yoaquim
Robię git submodule foreach git pull origin masteri działa częściowo: moduły podrzędne są aktualizowane, ale czasami HEADsą odłączane, a dla modułów podrzędnych w modułach podrzędnych nie mogę zatwierdzić zmian w moim bezpośrednim module podrzędnym, ponieważ ma on „zmodyfikowaną zawartość”, a nie „nowe zatwierdzenia” (ponieważ jego własne moduły podrzędne mają „nowe zatwierdzenia” i są aktualizowane).
yoaquim
55

Jak komentuje Sridhar poniżej, z Git1.6.5 + git clone --recursivejest teraz oficjalną alternatywą, opisaną w:

inamiy prawidłowo wskazuje się na git submodule update --init --recursivepolecenie, wprowadzony w popełnienia b13fd5c ponownie w git1.6.5 przez Johan Herland ( jherland) .

A IceFire dodaje w komentarzach :

Jeśli chcesz pobrać tylko jeden moduł podrzędny z
git submodule update --init <submoduleName>modułu podrzędnego, to jest do zrobienia.


(starsza oryginalna odpowiedź)

Zgodnie ze stroną podręcznika

 git submodule update --recursive

powinien zaktualizować wszystkie zagnieżdżone moduły podrzędne. Ale część init może nie być rekurencyjna.

W zależności od wersji Git, możesz wrócić do bardziej „skryptowego” podejścia, korzystając z tego artykułu Rekurencyjne aktualizowanie podmodułów Git, który umożliwia rekurencyjne inicjowanie i aktualizację:

#!/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
źródło
1
Nie git clone --recursivewystarczy?
Sridhar Ratnakumar
@Sridhar: jest do klonowania, jak wspomniano w stackoverflow.com/questions/3796927/git-clone-submodule i stackoverflow.com/questions/4251940/ ... z Git1.6.5 i nowszych. Zredagowałem odpowiedź, aby to odzwierciedlić.
VonC
Uwaga: jeśli chcesz pobrać tylko jeden moduł podrzędny git submodule update --init <submoduleName>modułu podrzędnego, to jest do zrobienia; Dotarłem tutaj, szukając tej odpowiedzi
IceFire
1
@IceFire Dziękuję. W odpowiedzi zawarłem Twój komentarz, aby uzyskać lepszą widoczność.
VonC,