Git 의 서브모듈(Submodule)
이란 하나의 저장소 안에 있는 또 다른 별개의 저장소이다.
보통 다른 원격 저장소를 가져와(pull) 서브모듈로 사용하게 된다.
Submodule을 추가하려는 부모를 parent라고 하고, Submodule로써 추가되려는 자식을 child라고 가정할 때, 다음과 같이 사용할 수 있다.
// 아직 parent에 submodule이 추가되지 않은 상태에서 다음 명령어를 입력하여
// submodule 추가를 해줄 수 있다.
git clone git@github.com:snowdeer/parent.git
cd parent
git submodule add git@github.com:snowdeer/child.git child
git commit -m "submodule is added."
git push
이 때, 별도로 git add 절차 없이 바로 commit 할 수 있다.
git clone으로 parent를 가져왔을 때, 내부의 child는 디렉토리만 만들어져 있고 내부가 없다. 이 때 submodule 초기화 및 업데이틀 해 주어야 한다. 루트에서 다음 명령어를 실행하면 된다.
git submodule init
git submodule update
다만, 이 때 submodule의 소스 버전은 최신 버전을 가리키는 것이 아니라, submodule add를 수행했을 때의 버전을 가리키고 있다. submodule은 리파지토리가 실제로는 분리되어 있기 때문에 각 모듈의 버전이 따로 관리되는데, parent 프로젝트에서는 현재 submodule의 버전이 최신인지 아닌지 신경쓸필요없이 안정적인 특정 버전만 가리키면 되기 때문에 프로젝트 배포 등에서는 관리가 수월한 장점이 있다. 물론, 개발중인 프로젝트에서는 각 submodule들을 최신 버전으로 유지해야 할 경우 각 submodule들의 업데이트를 수동으로 한 번씩 더 해줘야 하는 단점이 있기도 한다.
submodule을 최신 버전으로 교체하는 방법
child
디렉토리에 들어가서 각각의 submodule들을 개별 업데이트 해주는 방식. 각 submodule 디렉토리에서 git pull
명령어나 git checkout
명령어 등을 이용해서 업데이트 가능.parent
내에서 git submodule foreach git pull origin master
명령어를 실행하여 하위 submodule들을 전부 업데이트 해주는 방법