우테코를 할 때 db 패스워드, 시크릿 키 같은 것들을 저장하기 위해 서브모듈을 쓰는 팀이 많았다. 본 프로젝트 레포 (public) -> 민감 정보를 저장한 레포 (private) 이렇게 구성하는 형식이다. 그때 우리 팀에서는 암호화하는 방식을 써서 서브모듈을 쓸 일이 없었다. 하지만 지금 회사에서 서브모듈로 공통적으로 필요한 스크립트들을 관리하고 있어 간단하게라도 살펴보기로 했다.
서브모듈은 두 프로젝트를 서로 별개로 다루면서도, 하나가 다른 프로젝트를 사용할 수 있게 만들어주는 도구다.
앞서 말한것처럼 민감한 정보들을 github에 올려 관리할 경우, 서브 모듈은 프라이빗으로 설정하고, 상위 레포에서 서브 모듈을 이용하는게 좋은 예다. 또 도커파일 같은 경우 msa 환경에 있는 모든 레포들이 갖고 있을 필요가 없다.
레포 두개를 만든다.
하위 레포에 공통으로 사용할 파일을 만들어서 푸시한다.
cd master-repository
git submodule add https://github.com/injoon2019/sub-repository.git
이렇게 하면 로컬에서 .gitmodules가 생긴다.
파일을 열어보면 이렇게 어떤 서브모듈들을 가지는지 알수 있게 나온다.
git status 명령어를 입력하면 .gitmodules 가 버전관리 대상임을 알 수 있다.
git은 서브모듈 디렉토리 하위의 파일 수정 사항을 직접 추적하지 않고, 디렉토리 통째로 커밋으로 취급한다. 따라서 서브모듈에서 변경이 있었다면 상위 레포에서 sub-repository에 가서 git pull을 해야한다. 또는 git submodule update --remote
를 통해 서브모듈의 최신 커밋을 가져올 수 있다.
git clone --recurse-submodules https://github.com/injoon2019/master-repository.git
명령어를 사용하면 서브모듈까지 함께 클론할 수 있다.
https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-%EC%84%9C%EB%B8%8C%EB%AA%A8%EB%93%88