Git Submodule이란?
Git Submodule은 다른 Git 저장소를 내 저장소 안에 특정 커밋에 고정해서 포함하는 기능이에요.
왜 쓰는가
외부 라이브러리 소스코드가 필요할 때 직접 복사해서 넣으면 이런 문제가 생겨요.
- 원본 저장소와의 연결이 끊겨요
- 업데이트를 추적할 수 없어요
- 같은 코드가 여러 곳에 생겨요
Submodule을 쓰면 "이 저장소의 이 커밋을 여기에 넣어라"는 참조(포인터) 만 저장해요.
실제로 저장되는 것
.gitmodules— submodule URL과 경로 매핑- Git 내부에 해당 submodule이 가리키는 커밋 해시
내 저장소에는 전체 소스 대신 어떤 커밋을 참조하는지만 기록돼요.
사용법
추가
Bash
git submodule add https://github.com/example/lib.git path/to/lib
Clone
Bash
# clone할 때 submodule까지 한번에
git clone --recurse-submodules <repo-url>
# 이미 clone한 후 submodule을 가져오기
git submodule update --init --recursive
업데이트
submodule을 최신 커밋으로 올리고 싶을 때는 이렇게 해요.
Bash
cd path/to/lib
git pull origin main
cd ..
git add path/to/lib
git commit -m "update submodule"
git submodule update --remote path/to/lib로 원격 브랜치의 최신 커밋을 한 번에 가져올 수도 있어요. 이때도 바뀐 커밋을 git add와 git commit으로 기록해야 해요.
주의할 점
- 그냥
git clone하면 submodule 디렉토리가 비어 있어요.--recurse-submodules옵션을 쓰거나, clone한 뒤git submodule update --init --recursive를 실행해야 해요. - submodule은 특정 커밋에 고정되어 있어서, 원본 저장소가 업데이트되어도 자동으로 따라가지 않아요. 직접 업데이트해야 해요.