왜 쓰는가?
git submodule의 단점
- 상위 저장소는 서브모듈의 정보 중에서 checkout한 커멧의 SHA 값만 기록한다.
- 그러므로 상위 저장소 내 서브모듈로 들어가서 변경을 쌓아 push를 하면, conflict가 나는 경우가 많다.
- 즉, 서브모듈을 변경하고 싶으면, 꼭 그 래포로 가서 수정해야하는 번거로움이 있다.
Git subtree 장점?
- git submodule이 SHA 값만 저장하는 것과 달리,
- subtree는 상위 저장소에 파일을 직접 추가하고 tracking한다.
- 자연히 subtree의 파일 및 변경사항도 상위 저장소에 기록된다.
- "서브트리의 원격에 있는 source" 와 "서브트리를 추가한 저장소의 source"가 달라도 ->
subtree merge
기능을 사용해서 양쪽의 변경사항을 모두 반영할 수 있다.
- subtree의 컴포넌트를 상위 저장소의 프로젝트에서 사용할 때 버그를 발견했다면, 즉시 수정해서 커밋한 후 버그를 해결한 상태로 subtree의 원격에 반영할 수 있다는 편리함이 있다.
Git subtree 단점?
- subtree에서 변경이 가능하다는 것 자체가 자유도를 증가시킨다는 점에서 한편으로는 단점이다.
Git subtree 사용법
- 예시
- 상위 저장소: rhostem/gitsubtree-consumer
- 서브트리로 추가될 저장소: rhostem/gitsubtree-lib
서브트리로 사용할 원격 저장소 추가
git remote add <원격 저장소의 이름> <원격 저장소의 주소>
git remote add gitsubtree-lib git@github.com:rhostem/gitsubtree-lib.git
- 명령어 입력 후, gitsubtree-consumer 에서
git remote
를 입력하면 아래와 같이 나온다.
origin
gitsubtree-lib
새로운 원격 저장소의 브랜치를 서브트리로 추가
- prefix 옵션으로 서브트리를 clone할 폴더를 지정한다.
git subtree add --prefix <클론할 폴더> <원격 저장소의 이름> <브랜치 이름>
git subtree add --prefix lib gitsubtree-lib master
- 결과적으로 gitsubtree-consumer 디렉토리 내 폴더 구조는 아래와 같다.
- README.md (gitsubtree-consumer의 파일)
- lib
- README.md (gitsubtree-lib 의 파일)
서브트리를 원격에서 pull 받기
- 서브트리를 추가하는 명령어와 큰 차이가 없다.
git subtree pull --prefix <pull할 폴더> <원격 저장소의 이름> <브랜치 이름>
git subtree pull --prefix lib gitsubtree-lib master
- 커멘트 라인에서 실행 후 병합이 완료되면, 에디터가 열리면서 커밋 메시지의 저장을 요구할 수도 있다.
서브트리를 원격에 push 하기
- 상위 저장소에서 서브트리의 source를 직접 수정 후, 변경사항을 commit하고 원격에 push 할 수 있다.
git subtree push --prefix <push할 폴더> <원격 저장소의 이름> <브랜치 이름>
git subtree push --prefix lib gitsubtree-lib master
- 항상 상위 저장소의 최상위 폴더에서 실행햐아 한다.