2009-10-08 9 views
109

Kann ein Git-Submodul aus mehreren anderen Git-Submodulen bestehen und der Super-Git-Repo den Inhalt für jedes Submodul holen?Git-Submodul innerhalb eines Submoduls (verschachtelte Submodule)

Ich habe versucht, dies mit dem offensichtlichen/naiven Ansatz der Erstellung eines Git Repo mit mehreren Submodulen zu tun.

Dann Hinzufügen dieser Git Repo zu einem anderen Git Repo als Submodul.

Dann versuchen, aus dem Stammverzeichnis des Super Git Repo von git submodule init und dann git submodule update ziehen. Dies führt jedoch dazu, dass die Untermodule nicht abgerufen werden können.

Antwort

149

Wie in Retrospectively add --recursive to a git repo erwähnt

git submodule update --init --recursive 

sollte funktionieren.

+8

Das hat für mich funktioniert. Beachten Sie, dass ich fälschlicherweise dachte, dass "git Submodul init; git submodule update --recursive' war gleichbedeutend mit dem oben genannten, ist es aber nicht. – jsdalton

+0

+1 Ich mag das viel besser als das, was ich verwendet habe: git submodul foreach git submodul init ... dann git submodul update - rekursiv –

+0

Leider funktionierte das nicht für mich. Keine Fehler, keine Nachrichten, nichts. –

49

Wie Sridhar Kommentare unten, von Git1.6.5 +, git clone --recursive ist jetzt die offizielle Alternative, beschrieben in:

inamiy korrekt points out der Befehl git submodule update --init --recursive, eingeführt in commit b13fd5c, wieder in git1.6.5, von Johan Herland (jherland).

Und IceFire fügt in the comments:

Wenn Sie nur ein Modul eines Submoduls zur Kasse möchten, dann
git submodule update --init <submoduleName> ist der Weg zu gehen.


(ältere ursprüngliche Antwort)

der Nach manual page

git submodule update --recursive 

sollten alle verschachtelten Submodule aktualisieren. Aber der Init-Teil darf nicht rekursiv sein.

Je nach Ihrer Version von Git, könnten Sie zu einem "Scripting" Ansatz zurückgreifen, mit diesem Artikel Recursively Updating Git Submodules die für rekursive init und Update ermöglicht:

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

Ist 'Git Klon - rekursiv 'nicht ausreichend? –

+0

@Sridhar: Es ist, zum Klonen, wie in http://stackoverflow.com/questions/3796927/git-clone-submodule und http://stackoverflow.com/questions/4251940/retrospectively-add-recursive-to erwähnt -a-git-repo/4261001 # 4261001, von Git1.6.5 und höher. Ich habe meine Antwort bearbeitet, um das zu reflektieren. – VonC

+0

Hinweis: Wenn Sie nur ein Submodul eines Submoduls auschecken möchten, dann ist 'git submodule update --init ' der richtige Weg; Ich bin hierher gekommen, als ich nach dieser Antwort gesucht habe – IceFire

Verwandte Themen