배경
다른 프로젝트의 기능을 앱에 추가하는 방법으로 모노레포 방식을 사용할 수 있지만, 각 프로젝트를 독립적으로 관리해야 하는 경우에는 적합하지 않다.
Git Submodule은 메인 프로젝트에서 외부 링크 형태로 서브 프로젝트를 연결해 두었다가, 필요할 때 최신 변경 사항을 가져와 작업한다.
이 방식은 서브 프로젝트의 별도 사본을 만들지 않으며, 원래 저장소의 최신 상태를 유지하면서 개발을 진행할 수 있게 해줍니다.
서브 프로젝트는 독립적으로 버전 관리를 유지하면서도, 메인 프로젝트와 쉽게 통합할 수 있습니다.
main project와 submodule project 관계
- main project에 submodule을 추가하여 사용한다.
- main project에 root에 submodule들을 관리하기 위한 .gitmodules 파일이 생성된다.
- main project는 submodule의 commit point를 바라보고 있다.
main-project/
├ src/
└ submodules/ # 서브모듈들을 모아두는 디렉토리
├── my-submodule/ # 서브모듈 디렉토리
│ ├── .git/ # 서브모듈 전용 Git 관련 파일들
│ ├── node_modules/ # 서브모듈의 의존성 패키지
│ ├── src/ # 서브모듈의 소스 코드
│ ├── package.json # 서브모듈의 패키지 구성 파일
│ ├── package-lock.json# 서브모듈의 패키지 잠금 파일
│ └── README.md # 서브모듈의 README 파일
└── another-submodule/ # 다른 서브모듈 디렉토리 (옵션)
├── .git/ # 서브모듈 전용 Git 관련 파일들
├── node_modules/ # 서브모듈의 의존성 패키지
├── src/ # 서브모듈의 소스 코드
├── package.json # 서브모듈의 패키지 구성 파일
├── package-lock.json# 서브모듈의 패키지 잠금 파일
└── README.md # 서브모듈의 README 파일
Gir submodule 시작하기
메인 프로젝트에 submodule 추가하기
서브모듈로 사용할 프로젝트 터미널에서 remote 주소 조회
$ git remote -v
메인 프로젝트에 github_url(서브 프로젝트 remote 주소) 추가
// git submodule add -b [브랜치명] [git url]
git submodule add -b master https://github.com/react-template.git react-app/submodules/template
서브모듈 상태 확인
$ git submodule status
메인 프로젝트 Clone
깃에서 프로젝트 clone시 서브모듈은 폴더만 가져오고 파일을 가져오지 않는다. 직접 서브모듈을 가진 프로젝트 clone하여 가져와야 한다.
$ git clone <git_url>
// 한번에 하고 싶은 경우
git clone --recurse-submodules <git_url>
서브모듈 저장소 초기화 및 업데이트
// $ git submodule init <folder_name 생략가능>
$ git submodule init
$ git update
submodule 버전 확인하기
서브모듈 커밋ID의 최신 버전여부를 확인하고 싶은 경우 github 마지막 커밋ID와 서브모듈 콘솔 버전을 비교하면 된다.
$ git submodule status
// b94fd8e91242a630811f234e00d5b30422a665a1 template (v0.0.0.0-153-gb94fd8e)
메인 프로젝트에서 서브 프로젝트 커밋ID(버전) 조회
$ git log --oneline
메인 프로젝트 커밋되지 않은, origin 서브 프로젝트에 최신 버전을 알고 싶을때
git submodule summary
메인 프로젝트 submodule 버전 업데이트
서브모듈 프로젝트의 최신 commit ID와 서브모듈 버전을 확인한다
$ git status
메인 프로젝트에서 서브모듈 업데이트 명령어를 실행한다. update시 서브모듈에 작업 merge가 되어 있지 않다면 기존에 작업한 내용이 날라갈 수 있으니 주의해야한다.
// .gitmodules에 설정된 URL(remote)로 연결된 저장소에 최신 커밋 시점으로 checkout
$ git submodule update --remote
// --remote가 붙어있지 않다면 메인 프로젝트에 submodule이 가진 커밋ID 시점으로 checkout
// $ git submodule update
서브모듈 작업 업데이트하여 원격 저장소에 반영한다.
// 메인 프로젝트안에 추가된 서브 프로젝트 root까지 이동
$ git pull
$ git add .
$ git commit -m "Update submodule"
$ git push origin master
메인 프로젝트 submodule 특정 커밋 ID 버전 업데이트
서브모듈 디렉토리로 이동합니다.
$ cd path/to/your/submodule
특정 태그의 커밋 ID 또는 tag 를 사용하여 체크아웃
// git checkout <commit-id>
$ git checkout b5ee5c3c6c4e54c8a9d43b6fb3e85386df60724e
// git checkout tags/<tag-name>
$ git checkout tags/v1.0.0.0
변경된 내용을 메인 프로젝트와 함께 원격저장소로 commit, push
cd - git add path/to/your/submodule
git commit -m "Update submodule to tag <tag-name>"
submodule 삭제
Git 캐시까지 같이 삭제해준다.
// git submodule deinit -f [submodule 디렉토리]
git submodule deinit -f react-app/submodules/template
// git rm -f [submodule 디렉토리]
git rm -f react-app/submodules/template
// rm -rf .git/modules/[submodule 디렉토리]
rm -rf .git/modules/react-app/submodules/template
// rm '[submodule 디렉토리]'
rm 'react-app/submodules/template '
'Git' 카테고리의 다른 글
Git Tag로 버전 관리와 릴리스를 쉽게 (1) | 2025.01.15 |
---|---|
마크다운(.md 파일) 문서 작성법 | README.md, CHANGELOG.md (0) | 2025.01.15 |
자주 사용하는 Git CLI (0) | 2024.06.17 |
Git 저장소 구조 이해 및 프로젝트 시작하기 (0) | 2024.05.24 |
코드 리뷰와 Merge 전략 정리 | Merge, Squash and Merge, Rebase and Merge (0) | 2024.05.24 |