Bir alt modülün içindeki Git alt modülü (iç içe alt modüller)


137

Git alt modülünün diğer birkaç git alt modülünden yapılması ve super git repo'nun her alt modülün içeriğini getirmesi mümkün müdür?

Ben bunu birkaç alt modülleri tutan bir git repo oluşturma bariz / naif bir yaklaşım kullanarak yapmaya çalıştım.

Daha sonra bu git repo'yu bir alt modül olarak başka bir git repo'suna eklemek.

Sonra süper git repo kök dizininden çekmeye çalışın git submodule initve sonra git submodule update. Ancak bu, alt-alt modülleri getiremez.


TortoiseGit'i kullanmanızı öneririm - kökünüzde kullanın ve ardından tüm alt modülleri Initialize, Özyinelemeli, Kuvvet işaretli olarak güncellemesini isteyin!
serup

Yanıtlar:


211

Geriye dönük olarak belirtildiği gibi, git deposuna yinelenen - ekleyin

git submodule update --init --recursive

çalışmalı.


13
Bu benim için çalıştı. Yanlışlıkla git submodule init; git submodule update --recursiveyukarıdaki ile eşanlamlı olduğunu düşündüm , ama değil.
jsdalton

+1 Bunu kullandığımdan çok daha iyi seviyorum: git submodule foreach git submodule init ... sonra git submodule update --recursive
Joseph DeCarlo

Ne yazık ki bu benim için işe yaramadı. Hata yok, mesaj yok, hiçbir şey yok.
Luís de Sousa

Tamamen iç içe geçmiş bu depoları nasıl güncellersiniz? Ben de geçtikten sonra --initbayrağı, alt modüller, benim Altmodüllerin birinin içinde, sadece eski sürümleri değil, en güncel olanları başlatıldı olsun.
yoaquim

Yapmam git submodule foreach git pull origin masterve kısmen çalışır: altmodüller güncellenir, ancak bazen HEADkendi alt modül beri (müstakil alır ve onu değil, "yeni hareketin" "içeriği değiştirilmiş" çünkü submodules içinde submodüller, benim direkt submodule en değişiklikleri taahhüt edemez "yeni taahhütler" ve güncellenir).
yoaquim

55

As Sridhar Git1.6.5 + 'dan, aşağıda yorumlar, git clone --recursiveaçıklanan resmi alternatif, artık şudur:

inamiy doğru işaretgit submodule update --init --recursive tanıtılan komutu, b13fd5c tamamlama ile tekrar git1.6.5 olarak, Johan HERLAND ( jherland) .

Ve IceFire yorumlara ekliyor :

Bir alt modülün yalnızca bir alt modülünü kontrol etmek istiyorsanız, o zaman
git submodule update --init <submoduleName>gitmek için yoldur.


(eski orijinal cevap)

Göre manuel sayfa

 git submodule update --recursive

iç içe geçmiş alt modülleri güncellemelidir. Ancak init kısmı özyinelemeli olmayabilir.

Git sürümünüze bağlı olarak, yinelenen başlatma ve güncellemeye izin veren Git Alt Modüllerini Özyineli Olarak Güncelleme olan bu makaleyle daha "komut dosyası oluşturma" yaklaşımına geri dönebilirsiniz :

#!/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 --recursiveYeterli değil mi?
Sridhar Ratnakumar

@Sridhar: klonlama için, Git1.6.5 ve sonrasında gelen stackoverflow.com/questions/3796927/git-clone-submodule ve stackoverflow.com/questions/4251940/… ' da belirtildiği gibi . Cevabımı bunu yansıtacak şekilde düzenledim.
VonC

Not: Bir alt modülün yalnızca bir alt modülünü kontrol etmek isterseniz git submodule update --init <submoduleName>, gitmenin yolu budur; Bu yanıtı ararken buraya geldim
IceFire

1
@IceFire Teşekkür ederim. Daha fazla görünürlük için yorumunuzu cevaba ekledim.
VonC
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.