Submodul Git di dalam submodul (submodul bersarang)

145

Apakah mungkin sebuah submodul git dibuat dari beberapa submodul git lainnya, dan super git repo mengambil konten untuk setiap submodul?

Saya telah mencoba melakukan ini menggunakan pendekatan yang jelas / naif untuk membuat repo git yang memegang beberapa submodul.

Kemudian menambahkan repo git ini ke repo git lain sebagai submodul.

Kemudian mencoba menarik dari direktori root dari repo super git git submodule initsaat itu juga git submodule update. Tetapi ini gagal untuk mengambil sub-submodul.

firstresponder
sumber
Saya menyarankan Anda menggunakan TortoiseGit - gunakan di root Anda dan kemudian minta untuk memperbarui semua submodul dengan Inisialisasi, Rekursif, Paksa dicentang!
serup

Jawaban:

220

Seperti yang disebutkan di Retrospektif menambahkan --recursive ke git repo

git submodule update --init --recursive

harus bekerja.

inamiy
sumber
13
Ini berhasil untuk saya. Perhatikan bahwa saya keliru mengira git submodule init; git submodule update --recursiveitu identik dengan yang di atas, tetapi sebenarnya tidak.
jsdalton
+1 Saya suka ini jauh lebih baik daripada yang saya gunakan: git submodule foreach git submodule init ... lalu git submodule update --recursive
Joseph DeCarlo
Sayangnya ini tidak berhasil untuk saya. Tidak ada kesalahan, tidak ada pesan, tidak ada apa-apa.
Luís de Sousa
Bagaimana Anda memperbarui repo bertingkat sepenuhnya ini? Ketika saya mengirimkan --initbendera, submodul, dalam salah satu submodul saya, baru saja diinisialisasi ke versi lama, bukan yang terbaru.
yoaquim
Ya git submodule foreach git pull origin master, dan berfungsi sebagian: submodul diperbarui, tetapi kadang-kadang HEADterlepas dan untuk submodul dalam submodul, saya tidak dapat melakukan perubahan submodul langsung saya karena memiliki "konten yang dimodifikasi" bukan "komitmen baru" (karena submodulnya sendiri memiliki "komitmen baru" dan diperbarui).
yoaquim
56

Seperti komentar Sridhar di bawah ini, dari Git1.6.5 +, git clone --recursivesekarang menjadi alternatif resmi, dijelaskan dalam:

inamiy benar menunjukkan yang git submodule update --init --recursiveperintah, diperkenalkan pada komit b13fd5c , lagi di git1.6.5, oleh Johan Herland ( jherland) .

Dan IceFire menambahkan di komentar :

Jika Anda ingin membayar hanya satu submodule dari sebuah submodule, maka
git submodule update --init <submoduleName>inilah caranya.


(jawaban asli yang lebih lama)

Menurut halaman manual

 git submodule update --recursive

harus memperbarui semua submodul bersarang. Tetapi bagian init mungkin tidak rekursif.

Bergantung pada versi Git Anda, Anda dapat kembali ke pendekatan "scripting", dengan artikel ini Memperbarui Submodul Git secara Rekursif yang memungkinkan init dan pembaruan rekursif:

#!/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);
}
VonC
sumber
1
Apakah tidak git clone --recursivecukup?
Sridhar Ratnakumar
@Sridhar: ini, untuk kloning, seperti yang disebutkan di stackoverflow.com/questions/3796927/git-clone-submodule dan stackoverflow.com/questions/4251940/… , dari Git1.6.5 dan yang lebih baru. Saya telah mengedit jawaban saya untuk mencerminkan itu.
VonC
Catatan: Jika Anda ingin membayar hanya satu submodule dari sebuah submodule, maka git submodule update --init <submoduleName>inilah caranya; Saya sampai di sini saat mencari jawaban ini
IceFire
1
@IceFire Terima kasih. Saya telah memasukkan komentar Anda dalam jawaban untuk visibilitas lebih lanjut.
VonC