프로젝트 개발을 진행하다보면, 간단한 소규모 프로젝트라면 문제 없겠지만
개발 범위가 커질수록 레포지토리 하나로 관리하기 힘들어진다.
특히, 앱1/앱2/서버1/ ... 이런식으로 하나의 역할에 대해서도 여러개로 쪼개진다면, 레포를 여러개 만들게 되는데 통합적인 부분을 관리하는 것이 몹시 힘들다. 코드가 중복될 가능성도 높아진다.
이런 부분을 보완하기 위해 존재하는 것이 submodule이다.
ㅇ submodule이란?
submodule은 Git 저장소 안에 또다른 Git 저장소를 포함할 수 있는 기능이다.
즉, 하나의 프로젝트 안에 다른 프로젝트를 넣어 독립적으로 관리할 수 있도록 만들어준다.
- 여러 프로젝트가 같은 코드(공유 라이브러리)를 사용할 때
- 별도로 관리되는 외부 프로젝트를 포함하여 사용할 때
- 메인 프로젝트와 별개로 특정 코드만 독립적으로 업데이트하고 싶을 때
사용할 수 있다.
ㅇ submodule 사용법
1. submodule 추가하기 (일종의 clone)
git submodule add <서브모듈 저장소 url> <저장 경로>
-> <저장 경로> 폴더에 서브모듈이 추가된다.
2. submodule 초기화
git submodule update --init --recursive
-> '--recursive' 옵션을 사용해 서브모듈 안의 서브모듈들까지 모두 초기화한다.
3. submodule 업데이트
git submodule update --remote --merge
-> 원격 저장소에서 최신 코드를 가져와서 병합한다.
4. submodule 삭제
git submodule deinit -f <서브모듈 경로>
rm -rf <서브모듈 경로>
git rm --cached <서브모듈 경로>
-> .gitmodules 파일에서도 해당 서브모듈 정보를 삭제해야 한다.
ㅇ submodule 사용 시 주의할 점
- submodule은 독립적으로 버전이 관리되므로, git pull을 해도 자동 업데이트x
따라서 직접 "git submodule update"를 해야 한다.
- submodule의 commit 변경 시 반드시 git add 해야한다.
"cd <submodule>" > "git checkout <branch>" > "git add <submodule 경로>"
- 단순히 코드 공유 목적이면 git subtree나 gradle, npm 등의 패키지 관리 시스템도 고려할 수 있다.
ㅇ subtree란?
Git 저장소 내에 다른 저장소의 코드를 통합하는 방식.
submodule과 비슷하지만, 독립적인 관리가 필요 없는 경우 더 편리한 사용이 가능하다.
ㅇ submodule vs subtree
submodule | subtree | |
코드 저장 방식 | 원격 저장소 링크만 포함 | 직접 소스 코드 포함 |
독립적 관리 가능 여부 | 가능(각 저장소가 독립적) | 없음(메인 저장소가 관리) |
협업 시 추가 작업 | 서브모듈 따로 update 필요 | 필요x |
적용 사례 | 외부 라이브러리, 독립적인 코드 | 특정 코드 통합 관리 |
즉, submodule은 외부 라이브러리를 독립적으로 관리할 때,
subtree는 외부 코드를 그대로 포함해서 관리할 때 적합하다.
공유 코드가 있지만 별도로 버전 관리의 필요성이 없거나,
서브모듈의 업데이트 과정이 번거로워서 피하고 싶을 때 사용할 수 있다.
ㅇ subtree 사용법
1. subtree 추가 (add)
git subtree add --prefix=<저장 경로> <저장소 url> <branch> --squash
<저장 경로> 폴더의 저장소의 <branch> 코드 추가
* --prefix : 저장할 폴더 경로
* --squash : 불필요한 커밋을 하나로 압축
2. subtree 업데이트 (pull)
git subtree pull --prefix=<저장 경로> <저장소 url> <branch> --squash
저장소의 최신 코드를 가져와 <저장 경로>에 반영
3. subtree에 변경 사항 반영 (push)
git subtree push --prefix=<저장 경로> <저장소 url> <branch>
<저장 경로>에서 변경된 내용을 저장소로 push
4. subtree를 별도 브랜치로 분리
git subtree split --prefix=<저장 경로> --branch <새로운 branch>
<저장 경로>의 코드만 포함한 <새로운 branch>를 생성
'CS > 형상관리' 카테고리의 다른 글
git merge rebase squash (0) | 2025.03.10 |
---|