CS/형상관리

[Git] submodule, subtree

졔졔311 2025. 3. 4. 11:12
728x90
반응형

프로젝트 개발을 진행하다보면, 간단한 소규모 프로젝트라면 문제 없겠지만

개발 범위가 커질수록 레포지토리 하나로 관리하기 힘들어진다.

특히, 앱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>를 생성

728x90
반응형

'CS > 형상관리' 카테고리의 다른 글

git merge rebase squash  (0) 2025.03.10