2009-10-08 192 views
109

git子模塊是否可以由其他幾個git子模塊構成,以及用於獲取每個子模塊內容的超級git回購?子模塊內部的Git子模塊(嵌套子模塊)

我試圖做到這一點,使用明顯/天真的方式創建一個持有幾個子模塊的git倉庫。

然後添加這個git回購到另一個git回購作爲子模塊。

然後嘗試從超級git回購的根目錄git submodule init然後git submodule update。但是這不能獲取子子模塊。

回答

149

正如Retrospectively add --recursive to a git repo

git submodule update --init --recursive 
提到

應該工作。

+8

這對我有用。請注意,我錯誤地認爲'git submodule init; git submodule update --recursive'是上面的同義詞,但事實並非如此。 – jsdalton 2012-03-21 16:43:12

+0

+1我喜歡這個比我使用的要好得多:git submodule foreach git submodule init ...然後git submodule update --recursive – 2012-03-27 14:19:18

+0

不幸的是,這並不適用於我。沒有錯誤,沒有消息,什麼都沒有。 – 2014-02-10 15:50:43

49

Sridhar下面的評論,從Git1.6.5 +,git clone --recursive現在是正式的替代,在所描述:

inamiy正確points outgit submodule update --init --recursive命令,在commit b13fd5c中引入,再次在git1.6.5中,由Johan Herland (jherland)引入。

而且IceFire增加in the comments

如果你想只檢出一個子模塊的子模塊,那麼
git submodule update --init <submoduleName>是要走的路。


(舊的原來的答案)

按照manual page

git submodule update --recursive 

應該更新任何嵌套子模塊。但init部分可能不是遞歸的。

根據您的Git版本,你可以回落到一個更「腳本」的方法,這篇文章Recursively Updating Git Submodules它允許遞歸的初始化和更新:

#!/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」是否足夠? – 2011-01-12 21:13:06

+0

@Sridhar:這是克隆,如http://stackoverflow.com/questions/3796927/git-clone-submodule和http://stackoverflow.com/questions/4251940/retrospectively-add-recursive-to中提到的-a-git-repo/4261001#4261001,來自Git1.6.5及更高版本。我編輯了我的答案以反映這一點。 – VonC 2011-01-12 21:19:24

+0

注意:如果您只想簽出一個子模塊的一個子模塊,那麼'git submodule update --init '是要走的路;我在搜索這個答案時來到了這裏 – IceFire 2017-08-30 15:09:41