자식 서브 모듈과 서브 트리의 차이점


300

자식 하위 모듈과 하위 트리를 사용하는 것의 개념적 차이점은 무엇입니까?

각각에 대한 일반적인 시나리오는 무엇입니까?


3
이것은 귀하의 모든 질문에 대한 답변은 아니지만 블로그
Chop


"Git 서브 모듈의 대안?": stackoverflow.com/questions/6500524/…
brillout

답변:


177

링크가 항상 외부 저장소의 헤드를 가리 키도록하려면 어떻게합니까?

다음을 사용하여 서브 모듈이 원격 모듈 리포지토리의 HEAD를 따르도록 서브 모듈을 만들 수 있습니다.

o git submodule add -b <branch> <repository> [<path>]. (따라서 분기를 지정하기 위해)
o git submodule update --remote서브 모듈의 내용을 <repository>/<branch>기본적으로 에서 최신 HEAD로 업데이트합니다 origin/master. 주 프로젝트는 여전히 --remote사용하더라도 서브 모듈의 HEAD 해시를 추적합니다 .



귀하의 답변은 다음과 같이 투표 된 답변에 반대되는 것 같습니다 : stackoverflow.com/questions/10443627/…
Nathan H

@NathanH이 (HEAD 추적 가능성)은 1 년 후 추가되었습니다 (2013 년 3 월, git 1.8.2 : github.com/git/git/blob/… )
VonC

하위 모듈 추종 행동은 다른 답변 에도 언급되어 있습니다 . 이 경우 나는 당신이 항상 서브 모듈의 HEAD를 가리키는 모두를 사용하여 수행되는 말을 의미 생각 add -b하고 --remote당으로, 이후 업데이트 명령에 서브 모듈 업데이트 문서 . 이 경우 -b마스터의 HEAD를 따르는 데 실제로 필요한가?
matanster

@matt는 -b서브 모듈에 대한 올바른 .gitmodule 메타 데이터를 생성하는 데 사용됩니다 (와 동일 git config -f .gitmodules submodule.<path>.branch <branch>).
VonC

그런 다음 가능과 거의가있다 --remote- --remote경우에도 작동 -b에 사용하지 않은 add. 두 경우 모두 업데이트로 인해 하위 모듈을 수용하는 상위 리포지토리에서 커밋이 발생하므로 링크가 실제로 "항상 HEAD를 가리 키지"않습니다. 원래 답변에서 제거하는 것이 좋습니다 (?)
matanster

351

하위 모듈은 링크입니다.

하위 트리는 복사입니다


121

개념적 차이는 다음과 같습니다.

자식 서브 모듈 당신은 일반적으로 작은 것들로 큰 저장소를 구분합니다. 서브 모듈을 참조하는 방법은 maven 스타일 입니다. 다른 (서브 모듈) 저장소에서 단일 커밋을 참조하고 있습니다. 서브 모듈 내에서 변경이 필요한 경우 서브 모듈 내에서 커밋 / 푸시를 수행 한 다음 기본 리포지토리에서 새 커밋을 참조한 다음 메인 리포지토리의 변경된 참조를 커밋 / 푸시해야합니다. 그렇게하면 완전한 빌드를 위해 두 저장소 모두에 액세스 할 수 있어야합니다.

자식 하위 트리 를 사용하면 기록을 포함하여 다른 저장소를 통합 할 수 있습니다. 따라서 통합 후에는 저장소의 크기가 더 클 수 있으므로 저장소를 더 작게 유지하는 전략이 아닙니다. 통합 후에는 다른 리포지토리에 연결할 수 없으며 업데이트를 원하지 않으면 액세스 할 필요가 없습니다. 따라서이 전략은 코드 및 기록 재사용에 더 적합합니다. 개인적으로는 사용하지 않습니다.


그러나 git subtree원하는 경우 여전히 푸시 할 수 있습니다.
Ixx

@lxx 리포지토리 URL을 알고 있다면…
Franklin Yu

@FranklinYu 왜 그걸 몰랐 을까요? 로컬 git 메타 데이터에서 해당 정보를 얻을 수 없습니까?
adi518

@ adi518 예, 하위 트리를 만든 사람이라면 가능합니다. 그러나 저장소를 GitHub로 푸시하고 다른 사람들이 저장소를 복제하면 하위 트리 URL을 자동으로 알지 못한다고 생각합니다.
Franklin Yu

@NiklasP- "주 저장소에서 새로운 커밋 참조"에 대해 자세히 설명 할 수 있습니까? 그것이 실행 방법에 대해 명확하지 않은 한 단계이므로 "변경된 참조"는 내가 이해하는 것이 아닙니다.
Robert Oschler

21

서브 모듈
원격으로 메인 REPO을 눌러 하위 모듈의 파일을 밀어하지 않습니다

하위 트리
를 메인 리포지토리로 푸시하여 하위 트리의 파일을 원격 푸시


3
"원격 리포지토리를 원격으로 푸시하면 하위 트리의 파일이 푸시됩니다"아니요, 그렇지 않습니다.
J Bramble

@JBramble 나는 아마도 그것이 SourceTree 앱으로 끝났다고 언급해야 할 것이다.git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags production refs/heads/master:refs/heads/master
Maciek Rek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.