Git โมดูลย่อยภายในโมดูลย่อย (โมดูลย่อยที่ซ้อนกัน)


145

เป็นไปได้หรือไม่ที่โมดูลย่อย git จะสร้างจากโมดูลย่อย git อื่น ๆ และ repo super git เพื่อดึงเนื้อหาสำหรับโมดูลย่อยแต่ละโมดูล

ฉันได้พยายามทำสิ่งนี้โดยใช้วิธีการที่ชัดเจน / ไร้เดียงสาในการสร้าง git repo ที่มีโมดูลย่อยหลายตัว

จากนั้นเพิ่ม git repo นี้ไปยัง git repo อื่นเป็นโมดูลย่อย

จากนั้นพยายามที่จะดึงจากไดเรกทอรีรากของ repo คอมไพล์ซุปเปอร์โดยแล้วgit submodule init git submodule updateแต่ไม่สามารถดึงข้อมูลโมดูลย่อยได้


ฉันแนะนำให้คุณใช้ TortoiseGit - ใช้ในรูทของคุณแล้วขอให้อัปเดตโมดูลย่อยทั้งหมดด้วย Initialize, Recursive, Force checked!
serup

คำตอบ:


220

ดังที่กล่าวไว้ในRetrospectively add --recursive to a git repo

git submodule update --init --recursive

ควรทำงาน.


13
สิ่งนี้ได้ผลสำหรับฉัน โปรดทราบว่าฉันคิดผิด ๆ ว่าgit submodule init; git submodule update --recursiveตรงกันกับข้างต้น แต่มันไม่ใช่
jsdalton

+1 ฉันชอบสิ่งนี้ดีกว่าสิ่งที่ฉันใช้อยู่: git submodule foreach git submodule init ... จากนั้น git submodule update --recursive
Joseph DeCarlo

น่าเสียดายที่สิ่งนี้ไม่ได้ผลสำหรับฉัน ไม่มีข้อผิดพลาดไม่มีข้อความไม่มีอะไร
Luís de Sousa

คุณจะอัปเดต repos ที่ซ้อนกันทั้งหมดได้อย่างไร เมื่อฉันส่งผ่าน--initแฟล็กโมดูลย่อยภายในหนึ่งในโมดูลย่อยของฉันเพิ่งเริ่มต้นเป็นเวอร์ชันเก่าไม่ใช่เวอร์ชันล่าสุด
yoaquim

ฉันทำgit submodule foreach git pull origin masterและใช้งานได้บางส่วน: โมดูลย่อยได้รับการอัปเดต แต่บางครั้งโมดูลย่อยจะถูกHEADถอดออกและสำหรับโมดูลย่อยภายในโมดูลย่อยฉันไม่สามารถยอมรับการเปลี่ยนแปลงของโมดูลย่อยโดยตรงได้เนื่องจากมี "เนื้อหาที่แก้ไข" ไม่ใช่ "การคอมมิตใหม่" (เนื่องจากโมดูลย่อยของตัวเองมี "การกระทำใหม่" และได้รับการอัปเดต)
yoaquim

56

ดังที่Sridharแสดงความคิดเห็นด้านล่างจาก Git1.6.5 + git clone --recursiveตอนนี้เป็นทางเลือกอย่างเป็นทางการที่อธิบายไว้ใน:

inamiyอย่างถูกต้องชี้ให้เห็นgit submodule update --init --recursiveคำสั่งนำมาใช้ในการกระทำ b13fd5cอีกครั้งใน git1.6.5 โดยโยฮัน Herland (jherland )

และIceFireเพิ่มในความคิดเห็น :

หากคุณต้องการชำระเงินเพียงโมดูลย่อยของโมดูลย่อยเดียว
git submodule update --init <submoduleName>นั่นคือวิธีที่จะไป


(คำตอบเดิมที่เก่ากว่า)

ตามหน้าคู่มือ

 git submodule update --recursive

ควรอัปเดตโมดูลย่อยที่ซ้อนกัน แต่ส่วนเริ่มต้นอาจไม่สามารถเรียกซ้ำได้

ขึ้นอยู่กับเวอร์ชันของ Git ของคุณคุณสามารถถอยกลับไปใช้วิธีการ "สคริปต์" ได้มากขึ้นด้วยบทความนี้การอัปเดตโมดูลย่อย 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

@Sridhar: สำหรับการโคลนตามที่กล่าวไว้ในstackoverflow.com/questions/3796927/git-clone-submoduleและstackoverflow.com/questions/4251940/…จาก Git1.6.5 และใหม่กว่า ฉันได้แก้ไขคำตอบของฉันเพื่อสะท้อนให้เห็นว่า
VonC

หมายเหตุ: หากคุณต้องการชำระเงินเพียงโมดูลย่อยของโมดูลย่อยเดียวgit submodule update --init <submoduleName>นั่นคือวิธีที่จะไป ฉันมาที่นี่เมื่อค้นหาคำตอบนี้
IceFire

1
@IceFire ขอบคุณค่ะ ฉันได้รวมความคิดเห็นของคุณไว้ในคำตอบเพื่อให้มองเห็นได้มากขึ้น
VonC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.