Git 에서 제공하는 서브모듈 이란 Git 저장소 안에 다른 Git 저장소를 디렉토리로 분리해 넣는 것이다. 하나의 저장소로 데이터를 관리하면 되는데 왜 다른 저장소의 정보를 가져와야 할까? 공식 사이트에서 알려주는 예시는 다음과 같다.

프로젝트를 수행하다보면 다른 프로젝트와 공유해야 하는 경우가 생긴다. 여러 프로젝트를 진행하다보면 동일한 기능을 구현해야 하는 상황이 올 수 있어 해당 부분을 라이브러리로 만들 수도 있다. 여러 프로젝트에서 사용해야 하는 기능을 모듈화 하여 가져오는 형식으로 이용할 수 있다.

공식 사이트에서 알려주는 서브모듈을 활용한 방식은 같으나 내가 사용한 목적은 다르다. 프로젝트를 개발하다보면 외부에 노출되어서는 안되는 정보를 관리해야 하는 경우가 있다. 물론 수동으로 쉘 스크립트 파일을 생성하여 자동화할 수 있지만 그것마저도 번거롭다면 서브모듈을 활용해볼 수 있다. 외부에 노출되면 안되는 중요한 정보를 가지는 설정 파일을 별도의 private 저장소에 생성하여 서브모듈을 이용해 폴더 형태로 다른 저장소에 가져올 수 있다. 우아한테크코스 레벨3 팀 프로젝트에서 활용해보았다.

https://github.com/woowacourse-teams/2022-momo

즉, 서브모듈을 활용한 방식은 다음과 같이 두 가지 방식이 있다.

서브모듈 시작하기

공유하려는 외부 저장소를 미리 생성해둔다. 그 후, 미리 만들어둔 저장소의 정보를 가져오려는 저장소에서 다음과 같은 명령어를 사용한다.

git submodule add {외부 저장소 URL}

현재 저장소에 서브모듈로 주소에 적힌 저장소를 가져온다. URL 은 상대경로도 되고 절대경로도 된다.

Untitled

기본적으로 서브모듈은 프로젝트 저장소의 이름으로 디렉토리를 만든다. 예제에서는 DbConnector 라는 이름으로 만든다. 명령의 마지막에 원하는 이름을 넣어 다른 디렉토리 이름으로 서브모듈을 추가할 수도 있다.

서브모듈을 추가하고 git status 명령어를 이용하여 관련 정보를 볼 수 있다.

Untitled

서브모듈을 추가하니 .gitmodules 파일이 생성되었다. 이 파일은 서브디렉토리와 하위 프로젝트 URL 의 매핑 정보를 담은 설정파일이다.

Untitled

Untitled

서브모듈 개수만큼 이 항목이 생긴다. 이 파일도 gitignore 파일처럼 버전을 관리한다. 다른 파일처럼 Push 하고 Pull 한다. 이 프로젝트를 Clone 하는 사람은 .gitmodules 파일을 보고 어떤 서브모듈 프로젝트가 연결되어 있는지 알 수 있다.

터미널에서 해당 저장소에 접근해서 git diff 명령어를 사용해보자.