2009-10-08 19 views
109

Czy jest możliwe, aby submoduł git został wykonany z kilku innych submodułów git, a super git repo do pobrania zawartości dla każdego modułu częściowego?Moduł submodule Git wewnątrz modułu danych (moduły zagnieżdżone)

Próbowałem to zrobić za pomocą oczywistego/naiwnego podejścia do tworzenia repozytorium git z kilkoma submodułami.

Następnie dodajemy to repozytorium git do innego repozytorium git jako moduł częściowy.

Następnie próba pobrania z katalogu głównego repozytorium super git przez git submodule init, a następnie git submodule update. Ale nie uda się pobrać submodułów.

Odpowiedz

149

Jak wspomniano w Retrospectively add --recursive to a git repo

git submodule update --init --recursive 

powinien działać.

+8

To zadziałało dla mnie. Zauważ, że błędnie pomyślałem, że 'git submodule init; Aktualizacja modułu git --recursive' była równoznaczna z powyższym, ale tak nie jest. – jsdalton

+0

+1 Podoba mi się to o wiele lepiej niż to, z czego korzystałem: git submodule foreach git submodule init ... następnie git submodule update --recursive –

+0

Niestety to nie działało dla mnie. Brak erozji, brak wiadomości, nic. –

49

Jako Sridhar komentarze poniżej, z Git1.6.5 + git clone --recursive jest teraz oficjalnym alternatywa, opisane w:

inamiy poprawnie points out Komenda git submodule update --init --recursive, wprowadzona w commit b13fd5c, ponownie w git1.6.5, przez Johan Herland (jherland).

IceFire I dodaje in the comments:

Jeśli chcesz kasy tylko jeden submodule o modułem, potem
git submodule update --init <submoduleName> jest droga.


(starszy odpowiedź oryginalny)

Według manual page

git submodule update --recursive 

powinien aktualizować żadnych zagnieżdżone submodules. Ale część init może nie być rekursywna.

W zależności od wersji Git, można spaść z powrotem do bardziej podejścia „skryptowy”, z tym artykułem Recursively Updating Git Submodules który pozwala na rekurencyjne init oraz aktualizacji:

#!/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

Czy "git clone --recursive" nie wystarcza? –

+0

@Sridhar: jest, do klonowania, jak wspomniano w http://stackoverflow.com/questions/3796927/git-clone-submodule i http://stackoverflow.com/questions/4251940/retrospectively-add-recursive-to -a-git-repo/4261001 # 4261001, od Git1.6.5 i późniejszych. Zmieniłem moją odpowiedź, aby to odzwierciedlić. – VonC

+0

Uwaga: Jeśli chcesz wypisać tylko jeden submoduł modułu częściowego, to 'git submodule update --init ' jest do zrobienia; Dostałem się tutaj, szukając tej odpowiedzi – IceFire