본문 바로가기

001Project

001프로젝트 / 저장소 안에 저장소, Submodule

001 Project?
001 Project란 어떠한 과제가 있을 때 그의 기초 단계인 0.0.1v을 만들어 보는 개념입니다.
서브모듈의 기초적인 부분만 다루고 있습니다.

서브모듈이란

Git 저장소 안에 다른 Git 저장소를 디렉토리로 분리해 넣는 것으로 프로젝트에서 외부 라이브러리를 가져다 쓰는 등의 경우에 사용될 수 있습니다.

어떻게 사용할까

생성

프로젝트의 작업 경로에서 다음 명령어를 이용하여 서브모듈을 생성합니다.

git submodule add repository주소
ex) git submodule add https://github.com/ordinCode/submodule-c.git

서브모듈 생성전

서브모듈생성후



저는 2개의 서브모듈을 생성해보았습니다. 위와 같이 각각의 디렉토리가 생성되고 .gitmodules파일이 만들어지는 것을 볼 수 있습니다.

.gitmodules

[submodule "submodule-c"]
	path = submodule-c
	url = https://github.com/ordinCode/submodule-c.git
[submodule "submodule-c-1"]
	path = submodule-c-1
	url = https://github.com/ordinCode/submodule-c-1

부모모듈과 서브모듈이 바라보고있는 remote 저장소가 다른 모습입니다.

최신버전 가져오기

다음 명령어를 통해 리모트 저장소로부터 코드를 local 저장소로 가져올 수 있습니다.

git submodule update --remote 서브모듈이름

ex) git submodule update --remote submodule-c

만약 서브모듈 이름을 명시해주지 않았다면 프로젝트에 포함된 모든 서브모듈에 대해서 update를 실행합니다.

이 기능은 기본적으로 master 브랜치를 추적하는데, 만약 다른 브랜치를 추적하고 싶다면 다음과 같은 명령어를 입력해주면 됩니다.

git config -f .gitmodules submodule.서브모듈이름.branch 추적할브랜치

ex) git config -f .gitmodules submodule.submodule-c.branch master

이때 '-f .gitmodules' 옵션을 주면 .gitmodule 파일에 'branch = master' 항목이 추가되어 모든 사용자에게 공유됩니다.

[submodule "submodule-c"]
	path = submodule-c
	url = https://github.com/ordinCode/submodule-c.git
	branch = master
...

만약 '-f .gitmodules'옵션을 주지 않는다면 이 설정은 해당 사용자에게만 적용됩니다.

 

수정사항 저장하기

서브모듈의 수정사항을 push하는 방법은 두가지가 있습니다.

첫번째는 위에서 확인한 바와 같이 submodule의 디렉토리는 다른 리모트 저장소를 바라보고 있으므로 평소 add commit push하는 방식 그대로 submodule작업 디렉토리에서 실행해주면 됩니다.

 

또 다른 방법을 소개하자면 "git push --recurse-submodules=" 있습니다.

'--recurese-submodules'에 대해서 자세히 말씀드리도록 하겠습니다.

현재 서브모듈에서 작업을 하고 commit을 상태라고 가정합니다. 아직 push는 하지 않았습니다.

이 상태로 부모프로젝트에서 변경사항을 아래와 같이 commit하고 push한다면, 서브모듈의 현재 코드는 아직 remote 저장소에 올라가 있지 않은 상태이기 때문에 문제가 발생합니다.

실제로 한번 서브모듈은 push하지 않은 상태로 부모프로젝트에서 push를 한 다음 github repository에서 해당 서브프로젝트에 접근해보니 404가 뜨더군요.

서브모듈에 접근해보니 404가 발생

이 상태에서 다시 서브모듈을 push해주니 다시 정상적으로 접근이 가능하게 되었습니다.

 

이와 같은 상황에서 유용하게 사용되는 것이 아래 명령어 입니다.

git push --recurse-submodules=check
=> push를 하지 않은 서브모듈이 있는지 검사

git push --recurse-submodules=on-demand
=> push를 하지 않은 서브모듈을 자동으로 push처리

 

아래 명령어를 사용하여 git push의 기본 설정을 추가해 줄 수도 있습니다.

git config push.recurseSubmodules on-demand

 

** 참고 자료

git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-%EC%84%9C%EB%B8%8C%EB%AA%A8%EB%93%88

반응형