Submodule이란
일반적으로 하나의 repository에 해당 프로젝트의 모든 내용이 포함된다. 그러나 하나의 repo로 관리하기 어려운 대형 프로젝트 역시 존재한다. 쉽게 shared library(slib)를 가져다 쓰는 경우를 생각해볼 수 있다. 가령 무지성으로 slib의 내용을 싹싹 긁어다가 하나의 main repo로 병합하여 관리한다고 생각해보자.
위 경우 두 가지 문제가 발생할 수 있다:
- slib의 업데이트가 이뤄졌을 때, 버전 관리가 매우 번거롭다. (Why? main repo와 commit logs를 공유하기 때문에)
- main repo의 변화에 맞춰 slib의 내용이 변경될 경우, 이를 사용하는 다른 모든 repo의 내용 역시 manually하게 전부 변경 해야 함. 당연히 slib의 내용은 main repo의 종속적이므로 다른 repo의 내용 역시 전부 manually하게 직접 변경 해줘야 함.
이러한 문제 해결을 위해 git은 submodule 이라는 개념을 지원한다. submodule은 repository 안의 repository를 허용한다. main repository와 sub repository (submodule)은 서로 독립적인 commit을 가지며 각각 따로 관리되어질 수 있다.
하나의 저장소(레포지토리)에서 다른 저장소를 포함하고 관리할 수 있게 해주는 기능
복잡한 프로젝트를 여러 저장소로 분할해 개발, 관리, 배포 용이
공통 코드 준비
공통 기능이 담긴 별도의 Git 저장소 준비
이 저장소가 여러 프로젝트에서 서브모듈로 추가될 저장소
서브모듈 추가
각 프로젝트의 Git 저장소에서 공통 코드를 서브모듈로 추가
git submodule add <저장소 URL> <경로> 명령어
서브모듈 초기화 및 업데이트
서브모듈을 추가한 후 git submodule init 및 git submodule update 명령어를 통해 서브모듈을 초기화하고 최신 상태로 유지
코드 사용
서브모듈로 추가된 코드는 해당 경로에 복사되며 각 프로젝트에서 이 코드를 사용할 수 있음
변경 사항 관리
서브모듈의 코드에 변경이 있을 경우 서브모듈 저장소에서 변경 후 커밋하고 각 프로젝트의 서브모듈을 업데이트하여 변경 사항을 반영
이를 위해 각 프로젝트에서 git submodule update --remote를 사용
submodule 을 추가할 main repository 를 생성하고 그 폴더 내에서 submodule 추가
$ git submodule add <remote repository>
# test 를 위한 command
$ git submodule add https://github.com/jiohjung98/npm-producer.git
$ git submodule add https://github.com/jiohjung98/npm-consumer.git
git submodule add 명령어를 통해 main repository 에 submodule 을 쉽게 추가할 수 있다.
그럼 다음과 같이 새로운 파일이 세 개의 파일이 생성됨을 알 수 있다.
한 가지 살펴볼 점은 submodule add 를 통해 clone 된 submodules 는 directory 임에도 하나의 file 로 취급(일반적인 file 과는 속성 자체가 다르지만)되며, submodule 내의 files 는 track 하지 않는다.
또한 submodule 의 정보를 가지는 .gitmodules 라는 파일이 생성된다.
$ git add .
$ git commit -m "commit message"
$ git push
main project 의 변동사항을 commit 하면 된다.
github 에서 submodule 을 추가한 main repo 를 확인하면, 일반적인 directory 와 달리 화살표가 박혀있는 directory 로 표시되며, submodule 의 실제 repository 를 hyperlink 한다.
@ (at sign) 뒤의 정보는 각 submodule 의 latest commit 을 의미한다.
submodule 을 포함한 project 를 clone 하게 되면 submodule 폴더가 텅 비어있게 된다. 이게 default behavior 이며, 실제 submodule 의 내용을 가져오기 위해선 로컬의 submodule 정보를 바탕으로 submodule 의 remote repository 데이터를 끌어와야 한다.
$ git submodule init
$ git submodule update
submodule init 명령어를 통해 submodule 을 위한 local 설정 파일을 구성하고, submodule update 를 통해 remote 데이터를 끌어온 후, 현재 main project 가 저장하고 있는 submodule 들의 commit 정보를 바탕으로 checkout 한다.
submodule init 후, .git/config 파일을 확인해보면 각각의 submodule 이 등록되어 있음을 확인할 수 있다.
git submodule update 명령어는 main project 의 현재 snapshot 에 박혀있는 submodule 의 commit 정보를 바탕으로 checkout 하는 명령어일 뿐이다.
그래서 git branch 명령어로 현재 branch 를 찍어보면 detached HEAD 로 나오는 모습을 볼 수 있다. 따라서 해당 branch 에서 작업하지 말고, main 으로 checkout 한 후에 작업을 진행하는 것이 좋다.
$ git checkout main
submodule 이 많다면 각각의 submodule 에 들어가서 checkout 하기가 쉽지 않다.
$ git submodule foreach git checkout main
submodule foreach 명령어를 사용해서 각각의 submodule 에 대해 명령어를 일괄실행할 수 있다.
'Frontend' 카테고리의 다른 글
npm package 구축 및 사용법 (0) | 2025.03.10 |
---|---|
캐시된 데이터로 인한 북마크 상태 미반영 문제 해결 (2) | 2024.10.21 |
Refresh Token 프론트엔드 접근 방식 (0) | 2024.09.25 |
SSR, SSG, ISR (6) | 2024.09.02 |
CSR vs SSR (0) | 2024.08.30 |