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


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.