서브 모듈

Bam·2025년 8월 21일
0

Git

목록 보기
35/35
post-thumbnail

서브 모듈

깃 리포지토리 내에서 다른 리포지토리를 포함하는 구조를 서브 모듈이라고 합니다.

로컬의 깃 자체는 무한대로 용량을 둘 수 있으나 온라인의 깃 저장소(깃허브 포함)은 용량을 제한하고 있기 때문에 깃 저장소 용량이 커지는 경우 분할의 필요성이 생기게 됩니다.

또한 여러 개의 서브 모듈로 나누게 되면 관리 및 재사용이 쉬워진다는 이점도 갖습니다.

실습 준비

다음과 같이 두 개의 빈 원격/로컬 리포지토리를 생성했습니다. 메인이 되는 쪽이 parent-repo이고 서브 모듈로 삽입될 저장소가 child-repo입니다.

또한 각 로컬 저장소 내에 parent.txt, child.txt(내용은 자율)를 생성하고 이들을 각각에 맞는 GitHub 리포지토리와 연결했습니다.


서브 모듈 추가하기

서브 모듈과 관련한 명령어들은 git submodule 명령어를 이용합니다.

이 중 추가하는 명령어는 git submodule add 명령어를 사용합니다.
이때 메인 저장소(parent)에서 추가하고자 하는 서브 모듈의 원격 저장소 URL을 통해 add해야합니다.

git submodule add 서브모듈_원격_저장소_URL 폴더명

이렇게 명령어를 수행하고 나면 parent-repo에는 my-child라는 이름으로 자식 리포지토리가 서브 모듈로서 추가됩니다.이때 수행되는 명령을 살펴보면 원격 저장소로부터 서브 모듈은 clone 한 다음 현재 저장소에 붙여넣는 것을 알 수 있습니다.

서브 모듈 추가 후에 git add/commit를 사용하여 변경 사항을 추적해야합니다.

.gitmodule

서브 모듈을 추가했을 때 서브 모듈 디렉토리와 함께 .gitmodules라는 설정 파일도 함께 생성된 것을 볼 수 있습니다.이 파일은 메인 저장소에 연결된 서브 모듈들을 관리하는 설정들을 가지고 있습니다.


서브 모듈 변경 작업

그러면 부모 저장소에 추가한 서브 모듈에서 작업 후 커밋을 하면 어떻게 되는지 알아보도록 하겠습니다.

먼저 /parent-repo/my-child경로로 이동하고child.txt를 아무렇게나 수정합니다. 이후 git status 명령으로 변경 사항을 확인합니다.child.txt에 변경사항이 발생했다고 나옵니다. 그러면 메인 저장소에서는 어떻게 표시되는지 볼까요?메인 저장소에서는 /parent-repo/my-child의 child.txt가 아닌 my-child 디렉토리에만 변경사항이 발생했다라고 알려줍니다.

이처럼 서브 모듈 내에서는 서브 모듈의 변경된 파일을 추적하고, 메인 저장소에서는 서브 모듈 저장소만을 추적합니다.

즉, 메인 저장소는 서브 모듈 내의 파일들에 대한 변경사항을 직접 추적하지 않고 서브 모듈의 저장소를 통해 변경사항을 간접적으로 추적하게 되는 것 입니다.

변경 후 커밋

위에서 본 것처럼 서브 모듈은 서브 모듈 내의 파일들만 추적을 하고, 메인 저장소는 서브 모듈의 저장소만을 추적합니다.

따라서 서브 모듈 관계에서 커밋은 반드시 두 가지 단계를 거쳐야 합니다.
먼저, 서브 모듈을 커밋해서 파일 변경 사항을 커밋시키고, 부모 저장소를 커밋함으로써 서브 모듈의 저장소 변경을 커밋하게 됩니다.

이때 서브 모듈을 git push하게 되면 원본 리포지토리에 변경 내용이 push되게 됩니다.

만약 원본 서브 모듈(자식 저장소)의 변경을 원치 않는 경우 서브 모듈이 아닌 Fork나 서브 트리의 방식을 이용하셔야합니다.

마찬가지로 원본 자식 저장소를 수정 하고 메인의 서브 모듈에도 적용시키고 싶다면 git pull을 통해 서브 모듈의 내용을 가져오면 됩니다.


메인 저장소 복제

서브 모듈이 포함된 메인 저장소를 clone하고자 할 때는 다음과 같은 과정들을 거쳐갑니다.
git clone 명령을 통해 메인 저장소를 복제합니다..gitmodules까지 포함되어 다 복제된 것 같지만 my-child 디렉토리에 가보면 내용이 비어있음을 알 수 있습니다.

이렇듯 메인 저장소는 서브 모듈의 저장소만을 추적하기 때문에 clone을 해도 서브 모듈 내부의 내용들을 가져오지 않습니다.

서브 모듈의 내용을 가져오기 위해서 다음과 같은 방법들을 사용합니다.

  1. 첫 clone 시 서브 모듈 초기화 + 업데이트
git submodule update --init --recursive
  1. 서브 모듈을 원격 저장소의 최신 커밋으로 업데이트
git submodule update --remote --merge
  1. 서브 모듈로 이동하여 직접 업데이트
cd my-child
git checkout master
git pull origin master

0개의 댓글