Git - submodule

JJ·2024년 4월 6일
0

Git&Github

목록 보기
4/4
post-thumbnail

Submodule

깃 저장소안에 외부의 저장소를 디렉토리로 분리해 넣는 방식으로, 저장소에 대한 커밋 내역이 별도로 관리된다.

간혹 깃 레포지토리에 위와 같은 형태를 본 적이 있을텐데, 이것이 바로 submodule을 사용한 형태이다. 나는 처음 submodule이란 기능을 접했을 때, monorepo 같은 건가 라는 생각을 했는데, 실제로는 전혀 다르다.

versus monorepo

모노레포는 대규모 프로젝트를 하나의 저장소에서 관리하는 방식이다. 즉, 모노레포에 존재하는 여러 프로젝트들은 서로 의존성이 존재할 수 있는 프로젝트로 각 프로젝트는 디렉토리로 구분되지만, 하나의 저장소에서 관리된다. 반면, submodule은 앞서 설명에서도 나왔듯이 별도의 외부 저장소의 주소를 복사하여 넣는 방식이다. 즉, 각각의 프로젝트는 서로 독립적인 관계라는 의미이다.

Submodule 사용하기

A 라는 레포지토리에서 외부에 존재하는 B 레포지토리의 저장소를 submodule로 추가하는 방법에 대해 알아보자.

git submodule add [B repository url]

명령어의 구조는 원격 레포를 추가할때와 유사하다. add 뒤에 추가할 저장소의 주소를 입력하게 되면, 해당 저장소의 이름으로 submodule이 추가되고, 해당 프로젝트 폴더에 .gitmodules라는 파일이 생성된다. 해당 파일에는 서브디렉토리와 해당 URL의 매핑정보가 들어가 있으며, 추가한 submodule의 갯수만큼 추가된다.

그리고, 로컬에서 submodule이 존재하는 레포지토리를 복사해 오는 방법을 알아보자.

git clone [A repository url]

우선, A 레포지토리를 clone 한다. 그리고, 디렉토리를 살펴보면, submodule로 관리되는 프로젝트의 디렉토리도 생성된 것을 확인할 수 있다. 하지만 내용은 비워져 있다.

git submodule init

위의 명령어를 사용하여, 서브모듈 정보를 기반으로 로컬 환경설정 파일을 준비한다.

git submodule update

위의 명령어를 사용하면, 최종적으로 submodule에 존재하는 파일들을 받아와서 비어져있던 디렉토리가 업데이트된다.
그리고 위의 과정을 한번에 진행하는 방법도 있다.

git clone --recurse-submodules [repository url]

submodule을 제거하는 방법도 알아보자.

  1. 로컬 환경에서 B 디렉토리를 삭제한다.
  2. .gitmodules 파일에서 삭제하려는 submodule의 매핑정보를 삭제한다.
  3. .git폴더 내부의 config 파일에서 관련된 설정을 삭제한다.
  4. 아래의 명령어를 입력한다.
git rm --cached path_to_submodule
  1. 현재 변경 사항을 커밋하고 푸시한다.
profile
한줄 한줄

0개의 댓글