サブモジュール内のGitサブモジュール(ネストされたサブモジュール)


137

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

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

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

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


TortoiseGitを使用することをお勧めします。ルートで使用してから、すべてのサブモジュールを初期化、再帰、強制チェックで更新するように依頼してください。
serup

回答:


211

Retrospectively add --recursive to a git repoで述べたように

git submodule update --init --recursive

うまくいくはずです。


13
これでうまくいきました。git submodule init; git submodule update --recursiveこれは上記と同じ意味であると誤って考えましたが、そうではありません。
jsdalton 2012年

+1私はこれを私が使っていたものよりもずっと好きです:git submodule foreach git submodule init ...そしてgit submodule update --recursive
Joseph DeCarlo

残念ながら、これは私にはうまくいきませんでした。エラーなし、メッセージなし、何もありません。
ルイス・デ・スーザ

これらの完全にネストされたリポジトリをどのように更新しますか?--initフラグを渡すと、サブモジュールの1つにあるサブモジュールは、最新のものではなく、古いバージョンに初期化されます。
yoaquim

私がやるgit submodule foreach git pull origin master、それが部分的に動作します:サブモジュールが更新されますが、時にはHEADそれはない「新しいコミット」「内容を変更」しているので外しますと、サブモジュール内のサブモジュールのために、私は私の直接のサブモジュールの変更をコミットすることはできません(独自のサブモジュールを持っているので、 「新しいコミット」と更新されます)。
yoaquim

55

以下のようシュリダール Git1.6.5 +から以下のコメント、git clone --recursiveで説明した、今公式の代替手段です。

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

そしてIceFireコメントに追加します

サブモジュールの1つのサブモジュールのみをチェックアウトする場合
git submodule update --init <submoduleName>は、次の方法です。


(古い元の答え)

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

 git submodule update --recursive

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

Gitのバージョンによっては、この記事を再帰的なinitと更新が可能なGitサブモジュール再帰的に更新することで、より「スクリプト」的なアプローチにフォールバックできます。

#!/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十分ではありませんか?
Sridhar Ratnakumar、2011年

@Sridhar:これは、Git1.6.5以降の、stackoverflow.com / questions / 3796927 / git - clone - submoduleおよびstackoverflow.com/questions/4251940/…で言及されているように、クローニング用です。私はそれを反映するように私の回答を編集しました。
VonC、2011年

注:サブモジュールの1つのサブモジュールのみをチェックアウトする場合git submodule update --init <submoduleName>は、次の方法です。この答えを探していると、ここに着きました
IceFire

1
@IceFireありがとうございます。見やすくするために、回答にコメントを含めました。
VonC 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.