Git 서브 모듈(Sub-module) 사용 방법 실습

2024. 12. 26. 14:45Project Log/학부 졸업프로젝트

서브 모듈을 알아보는 이유

기능별로 레포지토리를 분리할 예정이다. 이 레포지토리들을 Github Organization 아래 개별로 놔두는 것보다, 하나의 상위 레포지토리가 제어를 하는 형태가 어떻겠냐는 의견이 있었다. Git에서 서브 모듈의 사용 방법을 알아보려고 한다.

 

Git 서브 모듈이란?

Main 깃 저장소 안에 Sub 깃 저장소를 레포지토리로 분리해 넣은 것이다. main 레포지토리와 sub 레포지토리들이 독립적으로 생성된 상태에서, main 레포지토리 하위에 서브 모듈로 sub 레포지토리들을 추가한다고 볼 수 있다. 메인 저장소와 서브 저장소의 커밋은 동기화되지 않아, 직접 관리해야 한다. 그림으로 간단히 표현해 보았다.

 

서브 모듈 생성하기

먼저 main-repo와 sub-repo를 생성한다.

 

main-repo를 clone 하려는데, 권한 거부 에러가 나왔다.


  
git clone git@github.com:fusiontwo/main-repo.git

 

id_rsa, id_rsa.pub 파일이 없다면 새로 ssh 인증키를 생성한다. 


  
cd ~/.ssh // 해당 경로에서 id_rsa, id_rsa.pub 파일 있는지 확인
ssh-keygen -t ed25519 -C "{github 이메일 주소}"

 

아래 명령어로 pub key를 복사한다. Github > Settings > SSH and GPG keys > New SSH Key에 복사한 텍스트를 넣어 등록한다.


  
pbcopy < ~/.ssh/id_ed25519.pub

 

SSH key 생성 이후 git clone이 정상적으로 이루어지는 걸 볼 수 있다.

 

clone한 main-repo로 이동하여 아래 명령어를 실행한다.


  
git submodule add git@github.com:{github_username}/sub-repo.git {하위 디렉토리 경로}

 

아래 커맨드를 실행하면 .gitmodules 파일과 sub 디렉토리가 생성된 것을 확인할 수 있다. 


  
git status

 

vi로 .gitmodules 파일을 열어보면 하위 디렉토리와 url 정보를 가지고 있다.

 

서브 모듈을 메인 저장소로 push 한다.


  
git add .
git commit -m "feat: add submodules"
git push

 

깃허브에서 main-repo 아래에 서브 모듈이 생겼는지 확인했다.

 

서브 모듈을 포함한 main-repo clone 하기

서브 모듈을 포함한 레포지토리는 일반 레포지토리와 약간 다른 방식으로 clone 한다. 메인 레포지토리 clone, 서브 모듈 초기화, 서브 모듈 업데이트(pull) 과정을 거친다. 앞에서 clone했던 main-repo를 삭제하고, 다시 clone 테스트를 진행하였다. 방법은 두 가지가 있다.

 

방법 1. 단계별 clone


  
git clone git@github.com:{github_username}/main-repo.git // 메인 레포지토리 clone
cd main-repo
git submodule init // 서브 모듈 초기화
git submodule update // 서브 모듈 업데이트

 

방법 2. 방법 1을 하나의 커맨드로 실행


  
git clone --recurse-submodules git@github.com:{github_username}/main-repo.git

방법 1 실행 결과
방법 2 실행 결과

 

서브 모듈 상태 확인 & 변경 사항 업데이트

서브 모듈에서 변경 사항이 발생해도, 메인 레포지토리에 자동으로 반영되지는 않는다. 따라서 서브 모듈에 변경 사항이 있는지 확인하고 메인 레포지토리에서 업데이트해야 한다.

 

현재 서브 모듈의 상태를 체크해보았다.


  
git submodule status

 

sub-repo를 clone 하고, 파이썬 파일 1개를 새로 만들어 push 했다. 파이썬 파일을 커밋하는 작업은 main-repo 안의 sub 디렉토리에서 수행하는 것이 아니다. 따로 sub-repo를 clone 해서 수행해야 한다.


  
git clone git@github.com:{github_username}/sub-repo.git
cd sub-repo
vi test.py
git add test.py
git commit -m "fix: add submodule"
git push

 

main-repo에서 서브 모듈의 상태를 조회하면 이전에 조회한 commit ID와 동일하다. 즉, 서브 모듈에서 변경 사항이 발생해도, 메인 레포지토리에 자동 반영되지 않는다는 것이다.


  
git submodule status

 

서브 모듈을 업데이트하고 상태를 확인하면 commit ID가 변경된 것을 볼 수 있다.


  
git submodule update —remote
git submodule status

 

실제 레포에 서브 모듈 적용하기

프로젝트의 backend-repo에 다른 레포지토리들을 서브 모듈로 추가하였다.

 

 

* 참고 사이트

Git Submodule 사용하기

(https://devocean.sk.com/blog/techBoardDetail.do?ID=165172&boardType=techBlog)