Git submodule
블로그를 하면서 깃허브의 다양한 기능을 알게되는 것 같다. 오늘은 서브모듈에 대해 알게되었다.
📝 Submodule이란?
Git의 레포지토리 하위에 다른 저장소를 관리하기 위한 도구이다. 이때 상위 레포지토리를 슈퍼 프로젝트(superproject), 하위 레포지토리를 서브 모듈(submodule)이라고 부른다.
나는 처음에 이 서브모듈이 그냥 다른 레포지토리를 연결한 라이브러리라는 개념으로 이해했다. 그러나 블로그를 업데이트할 때마다 이 서브모듈을 어떻게 pull해야할지 몰랐다. 서브모듈이란 이름도 몰랐기에 그냥 무작정 검색하다가 ‘서브모듈’이라는 단어를 발견하게 된 것이다.
🍥 서브모듈이 들어간 레포지토리
📌 clone
서브모듈이 포함된 레포지토리는 클론 방법이 기존 방식과는 다르다.
1
git clone --recurse-submodules <레포지토리의 깃 주소>
이 방식으로 클론하면 서브모듈 파일 안에 파일들이 보이게 된다.
- 위의 방식으로 클론했을 때
- 기존 방식(
git clone <레포지토리의 깃 주소>
)으로 클론했을 때
📌 초기화
슈퍼 레포지토리에서 pull을 할 경우 서브 레포지토리에 새로 커밋된 내용들이 서브모듈에 pull되지 않는다. 아래는 처음 서브모듈을 사용할 때 초기화하는 과정이다. 최초 1회만하면 된다.
1
2
3
$ git submodule init
$ git submodule update
$ git submodule foreach git pull origin main
이 상태에서는 로컬만 불러온 상태이기 때문에 add, commit, push를 통해 원격 저장소로 보내줘야 한다.
📌 업데이트
여러 방법이 있는 것 같다.
- 바로 업데이트하고 머지
1
$ git submodule update --remote --merge
- 업데이트 후 따로 pull 후 add, commit, push
1
2
3
4
5
6
7
8
9
$ git submodule update
// 1.
$ git submodule foreach git pull
// 2. 사용자 저장소의 변경 사항이 git pull 을 수행했을 때 merge conflict 을 유발하는 경우가 종종 있으므로, 많은 경우에 conflict 의 가능성을 줄여주는 git pull --rebase 를 통해 사용자의 변경사항이 가장 최신 커밋 이후에 반영되도록 한다.
$ git submodule foreach git pull --rebase
This post is licensed under CC BY 4.0 by the author.