서브 모듈을 포함한“git clone”방법


1990

하위 모듈을 리포지토리에 넣으려고합니다. 문제는 부모 저장소를 복제 할 때 하위 모듈 폴더가 완전히 비어 있다는 것입니다.

git clone parent_repo실제로 하위 모듈 폴더에 데이터를 넣을 수있는 방법이 있습니까?

예를 들어, http://github.com/cwolves/sequelize/tree/master/lib/는 , nodejs-mysql-native외부 자식 서브 모듈 가리키고,하지만 난 체크 아웃 할 때 sequelize프로젝트를 해당 폴더가 비어 있습니다.


4
그 명령은 git clone --recurse-submodules --remote-submodules(Q3 2019 Git 2.23) : 하나의 명령으로 서브 모듈을 복제 하고 업데이트 합니다. 아래의 수정 된 답변을 참조하십시오 .
VonC

답변:


2975

Git 버전 2.13 이상 --recurse-submodules에서는 --recursive다음 대신 사용할 수 있습니다 .

git clone --recurse-submodules -j8 git://github.com/foo/bar.git
cd bar

편집자 주 : -j8버전 2.8에서 사용할 수있는 선택적 성능 최적화 옵션이며 한 번에 최대 8 개의 하위 모듈을 병렬로 가져옵니다 man git-clone.

버전 2.12까지 Git 버전 1.9 -j사용 (버전 2.8 이상에서만 사용 가능한 플래그) :

git clone --recursive -j8 git://github.com/foo/bar.git
cd bar

Git 버전 1.6.5 이상에서는 다음을 사용할 수 있습니다.

git clone --recursive git://github.com/foo/bar.git
cd bar

이미 복제 된 repos 또는 이전 Git 버전의 경우 다음을 사용하십시오.

git clone git://github.com/foo/bar.git
cd bar
git submodule update --init --recursive

122
정보가 부족한 클론이 자동으로 초기화 된 서브 모듈을 얻도록 git 저장소 에서이 동작을 기본값으로 지정하는 방법이 있습니까?
NHDaly 2013

11
@NHDaly 슬프게도, 아닙니다. (적어도 내가 아는 바는 없습니다.)
Mathias Bynens

6
논리적으로 git clone --recursive를 생각하면 하위 모듈의 하위 모듈도 채워집니다.
jayarjo


5
@ toszter : 너무 현명한가요? 보유 리포지토리가 아닌 하위 모듈의 버전이 필요한 경우 어떻게 master합니까?
Gauthier

498

서브 모듈이 채워지기 전에 두 가지를해야합니다 :

git submodule init 
git submodule update

8
나는 그것이 두려웠습니다 ...이 경우 부분 프로젝트를 확인하고 있기 때문에 의미가 없습니다. 하위 모듈 업데이트가 자동이 아님을 이해하지만 바인딩 된 버전이 자동으로 체크 아웃되지 않는 이유는 무엇입니까 ?? 그것을 강요 할 방법이 있습니까? 3 레벨의 하위 모듈이있는 프로젝트가 있으며 체크 아웃을하기 위해 그 정도를 통과 해야하는 것은 터무니없는 것 같습니다.
Mark

10
git-submodule(1)매뉴얼 페이지 ( kernel.org/pub/software/scm/git/docs/git-submodule.html )를 읽으십시오 . git submodule update이라는 멋진 매개 변수 를 지원하는 것을 알 수 --recursive있습니다.
joschi

95
왜 하나의 명령으로 둘 다 수행하지 않습니까? git submodule update --init(또한 내 대답 참조 ).
Mathias Bynens

9
이 두 명령으로 질문에 대답하는 것이 더 낫습니다. 그것은 작업을 수행하는 방법을 더 잘 설명합니다.
schmijos

6
@MathiasBynens 방금 로그인 한 컴퓨터에는 git 1.5.5.6 만 있으며 단축 명령은 지원하지 않지만 두 명령으로 지원합니다.
잭 폴슨

221

Git 2.23 (2019 년 3 분기) : 서브 모듈을 복제 하고 최신 버전으로 업데이트 하려는 경우 :

git clone --recurse-submodules --remote-submodules

기록 된 SHA1에서 복제하려는 경우 :

git clone --recurse-submodules

아래를 참조하십시오.


원문 답변 2010

코멘트에서 joschi가 언급 했듯이 git submodule이제 --recursive옵션 (Git1.6.5 이상)을 지원합니다 .

경우 --recursive지정,이 명령은 등록 된 서브 모듈로 재귀 적 및 내에서 중첩 된 서브 모듈을 업데이트합니다.

초기화 부분에 대해서는 git 서브 모듈을 재귀 적으로 작업하기를 참조하십시오 .
자세한 내용은 git submodule설명 을 참조하십시오 .

git 버전 1.6.5 이상에서는 다음 –-recursive옵션을 사용하여 수퍼 프로젝트를 복제하여 자동으로 수행 할 수 있습니다 .

git clone --recursive git://github.com/mysociety/whatdotheyknow.git

자식 2.8 2016 업데이트 : 참조 " 자식 서브 모듈이 사용 / PARALLELIZE 다운로드 속도를 어떻게 git clone --recursive? "

여러 스레드를 병렬로 사용하여 서브 모듈 가져 오기를 시작할 수 있습니다.
예를 들어:

git fetch --recurse-submodules -j2

Git 2.23 (Q3 2019)을 사용하면 하나의 명령으로 서브 모듈을 추적 분기에 복제하고 체크 아웃 할 수 있습니다!

Ben Avison ( )의 commit 4c69101 (2019 년 5 월 19 일)을 참조하십시오 . ( Junio ​​C Hamano의해 병합 - 커밋 9476094 , 2019 년 6 월 17 일)bavison
gitster

clone: --remote-submodules플래그 추가

사용하는 경우 git clone --recurse-submodules패스 할 수있는 방법 이전에 없었다 --remote암시로 전환 git submodule update하면 서브 모듈 오히려 SHA-1 superproject에 기록보다 자신의 원격 추적 분기에 체크 아웃하고자하는 모든 사용 사례에 대한 명령.

이 패치는이 상황을 수정합니다.
실제로 통과 --no-fetchgit submodule update잘 그들이 서브 모듈은 단지 복제 된 근거로, 원격 다시 단지에서 가져 오는 있도록 아래로 천천히 일을 제공합니다.

그 의미는:

--[no-]remote-submodules:

복제 된 모든 하위 모듈은 수퍼 프로젝트의 기록 된 SHA-1이 아니라 하위 모듈의 원격 추적 분기 상태를 사용하여 하위 모듈을 업데이트합니다. 로 전달하는 --remote것과 같습니다 git submodule update.


3
따라서 Git은 하위 모듈에 대한 적절한 지원을 추가하는 데 14 년이 걸렸습니다. 업데이트 해 주셔서 감사합니다! 하위 모듈이없고 기록 된 SHA1이없는 기본 리포지토리의 복제본이 이미 있고 각 하위 모듈의 최신 버전을 가져 오려면 어떻게해야합니까? 가능합니까?
Violet Giraffe

1
@VioletGiraffe 복제 된 저장소에 하위 모듈이있는 경우 "기록 된 SHA1"이 있습니다. 그리고 git submodule update --init --recursive --remote각 지점의 최신 커밋으로 업데이트해야합니다. (예 : stackoverflow.com/a/56981834/6309 )
VonC September

1
하위 모듈을 사용하는 Github의 템플릿 프로젝트가 있으며이 템플릿 저장소에 하위 모듈의 특정 개정을 커밋했습니다. 그러나이 리포지토리에서 새 프로젝트를 만들 때 나열된 명령 ( clone --recurse-submodules --remote-submodules또는 둘 다 submodule update --init --recursive --remote)을 사용하여 실제로 하위 리포지토리를 가져올 수는 없습니다. 내가 얻는 것은 .gitmodules 파일이며 수동으로 하나씩 복제하는 것 이외의 하위 저장소를 초기화하는 방법을 찾을 수 없었습니다. 나는 적어도 그것을 할 스크립트를 갖고 싶습니다 submodule foreach...
Violet Giraffe

해결책을 알고 있다면 대답 할 수있는 별도의 질문을하겠습니다. 다음은 수작업 이외의 방법으로 찾을 수없는 테스트 저장소입니다. github.com/VioletGiraffe/TEST
Violet Giraffe

@VioletGiraffe gitlink를 추가하고 커밋했지만 gitlink가 아닌 스택 ( stackoverflow.com/a/16581096/6309 , 인덱스의 특수 항목 : stackoverflow.com/a/19354410/6309 ) 여기에있는 저장소가 있습니다. 적절한 gitlink를
VonC

108

[빠른 답변]

이 명령을 사용하여 모든 하위 모듈과 함께 repo를 복제 할 수 있습니다.

git clone --recursive YOUR-GIT-REPO-URL

또는 이미 프로젝트를 복제 한 경우 다음을 사용할 수 있습니다.

git submodule init
git submodule update

33

하위 모듈이 분기에 추가 된 경우 복제 명령에 하위 모듈을 포함시켜야합니다.

git clone -b <branch_name> --recursive <remote> <directory>

이것은 내가 찾던 것과 더 비슷했지만 하위 모듈은 분기를 '분리'로 나열합니다. :(
AceFunk

28

이 시도:

git clone --recurse-submodules

이미 서브 모듈을 상위 프로젝트에 추가했다고 가정하면 서브 모듈 데이터를 자동으로 가져옵니다.


37
그 참고 --recurse-submodules하고 --recursive있습니다 해당 별칭 .
Joel

이 경우 @SuperUberDuper 이 답변에git submodule update --init --recursive 설명 된대로 수행 할 수 있습니다
Enrico


21

늦게 대답

// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORY
git clone --recursive https://USERNAME@bitbucket.org/USERNAME/REPO.git DESTINATION_DIR

방금 친구와 함께 시간을 보내면서 BitBucket에 대한 관리자 권한이 있더라도 항상 원본 저장소를 복제하고 저장소를 소유 한 사람의 암호를 사용하십시오. 이 광산 함정에 부딪쳤다는 것을 짜증나게 : P


바로 내가 다루고있는 것입니다. 하위 모듈이있는 비트 버킷 저장소에서 개발해야하는 사람은 저장소 작성자의 신임 정보를 사용해야한다고 말하는가? 블리치.
jsleuth 2016 년

@jsleuth는 그렇게 보인다-그것은 큰 시간을 빨고 ... 그리고 나는 그것을 알고있다.
카이저

그것은 버그처럼 들립니다. Bitbucket에보고 했습니까?
Mathias Bynens

@MathiasBynens이 문제에 걸려 넘어 졌습니까? 1 년 반이 지났는데 이것이 여전히 그런지 잘 모르겠습니다.
카이저

4
OP 질문에 대한 설명은 아니지만 Bitbucket의 관련없는 버그에 대해 자세히 설명합니다. 우연히 "SSH 키 인증 사용"으로 단축 될 수 있습니다.
Treffynnon

18

자식 저장소에 하위 모듈을 포함 시키려면 이것을 시도하십시오.

git clone -b <branch_name> --recursive <remote> <directory>

또는

git clone --recurse-submodules

18

--recursive저장소를 복제 할 때 플래그 를 사용할 수 있습니다 . 이 매개 변수는 git이 저장소에 정의 된 모든 하위 모듈을 복제하도록합니다.

git clone --recursive git@repo.org:your_repo.git

복제 후 때때로 하위 모듈 분기가 변경 될 수 있으므로 다음 명령을 실행하십시오.

git submodule foreach "git checkout master"

17

[빠른 답변]

상위 리포지토리 (일부 하위 모듈 리포지토리 포함)를 복제 한 후 다음과 같이하십시오.

git submodule update --init --recursive

11

서브 모듈 병렬 페치는 한 번에 여러 리포지토리를 페치 할 수 있도록하여 리포지토리 및 모든 관련 서브 모듈을 페치하는 데 필요한 시간을 줄이는 것을 목표로합니다. 다음과 같은 새로운 --jobs 옵션을 사용하면됩니다.

git fetch --recurse-submodules --jobs=4

Git 팀에 따르면 이는 많은 서브 모듈을 포함하는 리포지토리의 업데이트 속도를 크게 높일 수 있습니다. 새로운 --jobs 옵션없이 --recurse-submodules를 사용하면 Git은 서브 모듈을 하나씩 가져옵니다.

출처 : http://www.infoq.com/news/2016/03/git28-released


8

GitHub 리포지토리에 대해 동일한 문제가있었습니다. 내 계정에 SSH 키가 없습니다. 과정은

  1. SSH 키 생성
  2. GitHub 계정에 새 SSH 키 추가

그런 다음 하위 모듈 ( git clone --recursive YOUR-GIT-REPO-URL)을 사용 하여 저장소를 복제 할 수 있습니다.

또는

이미 복제 된 저장소에서 하위 모듈을 실행 git submodule init하고 git submodule update가져옵니다.


예, 그것은 Permission denied (publickey). fatal: Could not read from remote repository.오류입니다
Ender

5

이 시도.

git clone -b <branch_name> --recursive <remote> <directory>

분기에 하위 모듈을 추가 한 경우 복제 명령에 하위 모듈을 추가해야합니다.


5

새로운 프로젝트라면 간단히 다음과 같이 할 수 있습니다.

$ git clone --recurse-submodules https://github.com/chaconinc/YourProjectName 

이미 설치된 경우 :

$ cd YourProjectName (for the cases you are not at right directory) 
$ git submodule init
$ git submodule update
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.