Subodule Git bên trong một mô hình con (mô đun con lồng nhau)


137

Có thể cho một mô hình con git được tạo ra từ một số mô hình con git khác và repo siêu git để lấy nội dung cho mỗi mô hình con?

Tôi đã cố gắng làm điều này bằng cách sử dụng cách tiếp cận rõ ràng / ngây thơ của việc tạo ra một repo git giữ một số mô hình con.

Sau đó thêm repo git này vào repo git khác như một mô hình con.

Sau đó cố gắng kéo từ thư mục gốc của super git repo git submodule initvà sau đó git submodule update. Nhưng điều này không thể tìm nạp các mô hình con.


Tôi khuyên bạn nên sử dụng TortoiseGit - sử dụng nó trong thư mục gốc của bạn và sau đó yêu cầu nó cập nhật tất cả các mô hình con với Khởi tạo, đệ quy, Buộc kiểm tra!
serup

Câu trả lời:


211

Như đã đề cập trong Retrospectively add --recursive to git repo

git submodule update --init --recursive

nên làm việc.


13
Điều này làm việc cho tôi. Lưu ý rằng tôi đã nhầm lẫn rằng đó git submodule init; git submodule update --recursivelà đồng nghĩa với ở trên, nhưng nó không phải là.
jsdalton

+1 Tôi thích cái này tốt hơn nhiều so với những gì tôi đang sử dụng: git Subodule foreach git Subodule init ... sau đó git subodule update --recursive
Joseph DeCarlo

Thật không may, điều này đã không làm việc cho tôi. Không erros, không tin nhắn, không có gì.
Luís de Sousa

Làm thế nào để bạn cập nhật luận điểm đầy đủ lồng nhau mặc dù? Khi tôi chuyển qua --initcờ, các mô hình con, trong một trong các mô hình con của tôi, chỉ cần được khởi tạo thành các phiên bản cũ, không phải là phiên bản mới nhất.
yoaquim

Tôi làm git submodule foreach git pull origin mastervà nó hoạt động một phần: các mô hình con được cập nhật, nhưng đôi khi các mô hình con HEADbị tách ra và đối với các mô hình con trong các mô hình con, tôi không thể thực hiện các thay đổi của mô hình con trực tiếp bởi vì nó có "nội dung được sửa đổi" không phải là "cam kết mới" "Cam kết mới" và được cập nhật).
yoaquim

55

Như Sridhar bình luận bên dưới, từ Git1.6.5 +, git clone --recursivehiện là lựa chọn chính thức, được mô tả trong:

inamiy một cách chính xác chỉ ra các git submodule update --init --recursivelệnh, được giới thiệu trong phạm b13fd5c , một lần nữa trong git1.6.5, bởi Johan HERLAND ( jherland) .

IceFire thêm vào trong các ý kiến :

Nếu bạn muốn kiểm tra chỉ một mô hình con của mô hình con, thì đó
git submodule update --init <submoduleName>là cách để đi.


(câu trả lời gốc cũ hơn)

Theo trang hướng dẫn

 git submodule update --recursive

nên cập nhật bất kỳ mô hình con lồng nhau. Nhưng phần init có thể không được đệ quy.

Tùy thuộc vào phiên bản Git của bạn, bạn có thể quay lại cách tiếp cận "kịch bản" hơn, với bài viết này Cập nhật đệ quy các Submodules cho phép khởi tạo và cập nhật đệ quy:

#!/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
Không git clone --recursiveđủ sao?
Sridhar Ratnakumar

@Sridhar: đó là, để nhân bản, như đã đề cập trong stackoverflow.com/questions/3796927/git-clone-submodulestackoverflow.com/questions/4251940/ , từ Git1.6.5 trở lên. Tôi đã chỉnh sửa câu trả lời của mình để phản ánh điều đó.
VonC

Lưu ý: Nếu bạn chỉ muốn kiểm tra một mô hình con của mô hình con, thì đó git submodule update --init <submoduleName>là cách để đi; Tôi đã đến đây khi tìm kiếm câu trả lời này
IceFire

1
@IceFire Cảm ơn bạn. Tôi đã bao gồm nhận xét của bạn trong câu trả lời để dễ nhìn hơn.
VonC
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.