서브 모듈 내부의 Git 서브 모듈 (중첩 서브 모듈)


137

자식 서브 모듈이 다른 여러 자식 서브 모듈로 만들어지고 슈퍼 자식 저장소가 각 서브 모듈의 내용을 가져올 수 있습니까?

나는 여러 서브 모듈을 보유하고있는 git repo를 만드는 명백하고 순진한 접근 방식을 사용 하여이 작업을 시도했습니다.

그런 다음이 자식 저장소를 다른 자식 저장소에 하위 모듈로 추가하십시오.

그 다음으로 슈퍼 자식의 repo의 루트 디렉토리에서 끌어 시도 git submodule init하고 git submodule update. 그러나 이것은 하위 서브 모듈을 가져 오지 못합니다.


TortoiseGit을 사용하는 것이 좋습니다. 루트에서 사용하고 Initialize, Recursive, Force checked로 모든 하위 모듈을 업데이트하도록 요청하십시오!
serup

답변:


211

회고 에서 언급했듯이 git repo에 --recursive를 추가하십시오.

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

그래도 완전히 중첩 된 저장소를 어떻게 업데이트합니까? --init플래그를 전달 하면 하위 모듈 중 하나의 하위 모듈이 최신 버전이 아닌 이전 버전으로 초기화됩니다.
yoaquim

내가 할 git submodule foreach git pull origin master, 그리고 부분적으로 작동 : 서브 모듈이 업데이트되지만, 때때로는 HEAD자신의 서브 모듈이 가지고 있기 때문에 (분리됩니다 그렇지 않은 "새로운 커밋을" "내용을 수정"때문에 서브 모듈 내에서 서브 모듈을 위해, 내가 직접 서브 모듈의 변경 사항을 적용 할 수 "새로운 커밋"및 업데이트).
yoaquim

55

스리는 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 : Git1.6.5 이상에서 stackoverflow.com/questions/3796927/git-clone-submodulestackoverflow.com/questions/4251940/…에 언급 된대로 복제 용 입니다. 나는 그것을 반영하기 위해 대답을 편집했다.
VonC

참고 : 서브 모듈에서 하나의 서브 모듈 만 체크 아웃 git submodule update --init <submoduleName>하려면 진행해야합니다. 이 답변을 검색 할 때 여기에 도착
IceFire

1
@IceFire 감사합니다. 가시성을 높이기 위해 귀하의 의견을 답변에 포함 시켰습니다.
VonC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.