git submodule

박주엽·2021년 2월 14일
0

git % github

목록 보기
4/5

submodule

많은 프로젝트를 서로 별개로 다루면서도 그 중 하나를 다른 하나 안에서 사용할 수 있도록 관리하는 도구가 서브모듈 입니다. git 저장소 안에 다른 git 저장소를 디렉토리로 분리하여 넣는 것이 서브모듈이고 다른 독립된 git 저장소를 clone해서 내 git 저장소 안에 포함할 수 있어야하며 각 git 저장소의 커밋은 독립적으로 관리합니다.

submodule 사용하기


예를 들어 submodule-main 리포지토리에 sub-1과 sub-2 리포지토리를 서브모듈로 관리한다고 가정하고 설명을 하겠습니다.
1. submodule-main 리포지토리를 clone을 받는다.(git clone 해당 리포지토리 주소)
2. git submodule add -b master 해당 리포지토리 주소 명령어를 통해 해당 리포지토리를 submodule-main의 서브모듈로 등록 합니다. 등록하면 서브모듈로 등록한 파일들의 디렉토리가 각각 생성된 걸 확인 할 수 있습니다.

3. 서브모듈 디렉토리에서 js파일하나를 생성하고 기존 방식대로 add,commit,push 순으로 작업 내용을 push했습니다.

4. 서브모듈에서 수정이 되면 상위 디렉토리에서는 자기와 연결된 서브모듈의 커밋이 변경되었기 때문에 서브모듈의 상위 디렉토리인 submodule-main도 커밋을 진행해야됩니다. 일반적인 방법으로 커밋을 하면 되고 주의해야될 점은 서브모듈의 작업내용들이 모두 push가 되었는지 확인할 필요가 있다. 만약 이를 확인하지 않고 push를 한다면 remote repo 입장에서는 submodule-main에 새로운 서브모듈 커밋과 연결이 되었다는 정보만 존재하고 실제 서브모듈 리포지토리에는 해당 커밋이 존재하지 않기 때문에 입니다.

5. submodule-main에서 push를 진행했다면 아래와 같이 서브모듈이 링크로 연결된 파일이 생성된 모습을 확인할 수 있습니다.

상세설명 및 주의사항

1. 작업 순서

외부로 부터 정보를 받아 갱신할 때(clone, pull, update)에는 작업 순서가 main 먼저 진행하고 sub는 나중이여야 합니다. 반대로 로컬의 작업내용을 push할 때는 sub 먼저 진행하고 main은 나중이여야 합니다.

2. main project clone

git submodule은 main project를 먼저 clone 한 뒤 sub project를 clone할 수 있습니다. main project를 clone 받는 것은 일반 clone하는 것과 동일하게 진행하면 됩니다. submodule을 포함한 프로젝트를 clone 받으면 .gitmodules라는 파일이 존재하는데 sub project의 폴더명과 git repo 주소가 작성되어 있습니다.

3. sub project clone

아래의 submodule명령어를 통해 .gitmodules에 명시되어 있는 sub project를 clone할 수 있습니다.
1. git submodule init => submodule 정보를 기반으로 로컬 환경설정 파일을 셋팅합니다.(.gitmodules파일의 정보를 .git/config에 등록)
2. git submodule update => remote 저장소에서 데이터를 가져오고 submodule을 포함한 프로젝트의 현재 스냅샷에서 checkout 해야 할 커밋 데이터를 가져옵니다. 위 2가지 명령은 한번에 실행할 수 있습니다.(git submodule update --init)
3. git submodule foreach git checkout master => 각각의 sub project를 master branch로 checkout 하기 위한 명령어 입니다. submodule update로 데이터를 받으면 sub project는 detached HEAD 상태로 어떤 branch에도 속하지 않는 상태가 되기 때문입니다.
4. git clone --recurse-submodules repo주소위 과정을 하나의 명령으로 진행할 수 있습니다. sub project의 코드를 수정하기 전에 항상 작업 branch로 checkout 해 주어야 합니다.

4. update submodule

main project는 pull을 통해 최신의 코드로 업데이트하고 sub project도 업데이트 할 때 각각의 project에서 fetch/merge, pull을 해도 되지만 main project에서 관리하는 것이 편리합니다.
git submodule update --remote --merge => main project와 링크되어 있는 sub project를 update 합니다.

특정 sub project만 update하고 싶은 경우 git submodule update --remote <REMOTE-REPO-NAME> --merge로 update할 수 있습니다.

git submodule update --init은 현재 main project에 link되어 있는 submodule의 데이터만 받아옵니다. 즉 main project의 커밋 당시의 정보만 받아오는 것입니다. 반면 git submodule update --remote는 remote repo의 최신 정보를 update하기 때문에 remote repo에 새로운 커밋이 있을 경우 local main project에는 새로운 sub project link가 연결되기 때문에 main project도 update 되어 집니다. 따라서 main project를 새로 커밋을 해야 됩니다.

submodule 장단점

반복되어 사용되는 코드는 모듈로 분리하여 관리하면 생산성이 높아지고 관리가 용이해진다는 장점이 있지만 submodule에서 변경 내용을 적용하려면 submodule 내에서 커밋/푸시를 진행하고 main project에서도 submodule의 새로운 커밋을 참조한 내용을 커밋/푸시해야되는 단점이 있습니다.

0개의 댓글