158

gitサブモジュールを他のいくつかのgitサブモジュールで構成し、スーパーgitリポジトリで各サブモジュールのコンテンツをフェッチすることは可能ですか?

私は、いくつかのサブモジュールを保持するgitリポジトリを作成するという明白で素朴なアプローチを使用してこれを実行しようとしました。

次に、このgitリポジトリをサブモジュールとして別のgitリポジトリに追加します。

次に、スーパーgitリポジトリのルートディレクトリからプルしようとしgit submodule initますgit submodule update。しかし、これはサブサブモジュールのフェッチに失敗します。

4

2 に答える 2

238

遡及的に --recursive を git リポジトリに追加するで述べたように

git submodule update --init --recursive

動作するはずです。

于 2011-07-03T09:13:17.013 に答える
57

以下のSridharのコメントのように、Git1.6.5+ からgit clone --recursiveは、以下で説明されている公式の代替手段になりました。

inamiyは、コミット b13fd5cで導入され、再び git1.6.5 でJohan Herland ( )によって導入されたコマンドを正しく指摘しています。git submodule update --init --recursivejherland

そして、IceFireはコメントに次のように追加します。

サブモジュールのサブモジュールを 1 つだけチェックアウトしたい場合は、これが最適
git submodule update --init <submoduleName>です。


(古い元の回答)

マニュアルページによると

 git submodule update --recursive

ネストされたサブモジュールを更新する必要があります。ただし、init 部分は再帰的ではない場合があります。

Git のバージョンによっては、再帰的な初期化と更新を可能にするこの記事Recurively 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);
}
于 2009-10-08T03:55:11.463 に答える