목차
Submodule 이란?
서브모듈(Submodule)은 git repository 안에 다른 하위 git repository 를 관리하는 도구이다.
예를 들어, 프로젝트 A 에서 외부 라이브러리를 사용하기 위해서 외부 라이브러리를 프로젝트 A 폴더 안에 저장하는 것이다.
서브모듈을 git repository 에 추가한 다음 github 에 올리면 아래와 같이 파란색 글씨로 표시된다.
서브모듈 git repository 이름과 서브모듈의 commit hash 값이 함께 표시되며, 클릭 시 해당 repository 로 이동한다.
이때, 서브모듈 repository 가 private 으로 설정되어 있다면, 다른 사람이 해당 서브모듈을 클릭했을 때 해당 페이지로 이동할 수 없다.
만약, 다른 사람들도 서브모듈 repository 를 접근할 수 있게 하고자 한다면 public 으로 전환하거나, collaborator 로 추가하면 된다.
서브모듈 활용하기
하나의 repository 안에서 다른 사람들과 코드를 공유하고 싶은 경우라고 해보자.
기존에 다른 repository 에서 작성한 코드가 있는 상태일 때 사용할 수 있는 방법은 크게 2가지이다.
1.
작성한 파일만 따로 복사해서 붙여넣기
•
가장 단순하고 직관적인 방법이다.
•
하지만 기존 commit 내역을 모두 복사해서 가져올 수 없기 때문에 다른 사람들이 이전 작업 내역을 할 수 없다는 단점이 있다.
2.
서브모듈 사용하기
•
서브모듈을 사용하면 기존 commit 내역을 보존하면서 다른 사람들과 코드를 공유할 수 있게 된다.
•
1번 방법과는 달리 기존에 사용하던 repository 에서 그대로 작업을 진행할 수 있다.
•
단점으로는 github repository 가 private 일 경우 일일이 collarborator 로 추가하거나 public 으로 바꾸어야 한다는 것이 있다.
•
또한, 서브모듈 repository 가 업데이트 되어도 상위 repository 에는 업데이트가 자동으로 반영되지 않아서 직접 업데이트를 수행해주어야 하는 번거로움이 따른다.
commit 내역을 공유해야 하는 상황이라면 서브모듈을, 그렇지 않다면 파일 복붙이 적절할 것이다.
서브모듈을 그림으로 표현하면 다음과 같다.
공유하는 repository 에는 각자 사용하던 repository 의 특정 commit 시점과 연결되어 있는 것이다.
그래서 각자 사용하던 repository 에 변경사항이 발생해도 git clone 으로 매번 모든 내용을 받지 않고 git submodule update --remote 명령어를 사용하면 변경된 부분만 효율적으로 받아올 수 있다.
Submodule 사용법
1. Submodule 추가하기
서브모듈을 추가하고자 하는 repository 에 아래와 같이 명령어를 실행한다.
$ git submodule add [git 주소]
Bash
복사
서브모듈을 추가하면 repository의 루트 디렉토리에 .gitmodules 파일이 생성되고, 현재 디렉토리에 추가한 서브모듈 폴더가 생성된다.
그리고 추가한 서브모듈은 staging 영역까지 자동으로 올라간다. 즉, 추가한 서브모듈에 대해 git add 를 자동으로 수행한다는 것이다.
참고로 .gitmodules 는 git repository 내부에 있는 모든 서브모듈에 대한 정보를 저장하고, 관리하는 파일이다.
위의 사진처럼 각 서브모듈이 위치한 경로와 git url 이 함께 저장된다.
2. commit 생성하기
github 에도 서브모듈을 올리기 위해서는 commit 을 생성해야 한다.
$ git commit -m "MESSAGE"
Bash
복사
3. push 하기
github 에 업로드 하기 위해 아래와 같은 명령어를 입력한다.
$ git push origin main
Bash
복사
정상적으로 수행했다면 아래의 사진과 같이 서브모듈이 추가된다.
4. 서브모듈 업데이트하기
서브모듈에 해당하는 repository 에서 업데이트가 발생해도 서브모듈을 가지고 있는 repository 에서는 이를 감지하지 못한다.
위의 사진은 서브모듈에 새로운 commit 이 등록되었고, commit hash 값은 3992430 이다.
참고로 commit hash 는 commit 마다 부여되는 고유한 값을 의미한다. 그래서 commit hash 값을 이용해서 원하는 commit 시점으로 되돌리거나 해당 시점의 파일을 찾아볼 수 있다.
하지만, 서브모듈을 가진 repository 에 들어가면 서브모듈의 commit hash 가 여전히 38df718 을 가리키고 있다.
그렇기 때문에 서브모듈에 새로운 commit 이 생겼다면 서브모듈을 가지고 있는 repository 에서 번거롭지만 직접 서브모듈을 업데이트 해주어야 한다.
우선 업데이트를 수행할 서브모듈의 브랜치를 설정하기 위해 루트 디렉토리에서 아래와 같은 명령어를 실행한다.
$ git config -f .gitmodules submodule.[서브모듈 이름].branch [업데이트 할 브랜치]
Bash
복사
위의 사진에서는 브랜치를 main 으로 설정했다.
예전에는 github 에서 repository 를 생성하면 master 브랜치가 기본으로 설정되어서 서브모듈의 브랜치도 기본적으로 origin/master 에서 가져온다. 최근에는 기본 브랜치가 main 으로 변경되었기 때문에 이를 직접 추가해주는 것이다.
위의 사진처럼 .gitmodules 파일을 확인하면 해당 서브모듈 정보에 branch = main 이 추가된 것을 확인할 수 있다.
그 다음 아래의 명령어를 실행해서 서브모듈을 업데이트한다.
$ git submodule update --remote [서브모듈 경로]
Bash
복사
git status 명령어를 사용하면 서브모듈에 새로운 commit 이 생성되었다는 것을 확인할 수 있다.
git add 와 git commit 을 수행하고 git push 까지 수행해서 원격 저장소에 올린 다음 github 를 들어가보면 정상적으로 최근 commit 으로 업데이트 된 것을 확인할 수 있다.
위의 사진처럼 해당 서브모듈의 최근 commit hash 값에 해당하는 3992430 가 표시되는 것을 확인할 수 있다.
5. 서브모듈 삭제하기
더 이상 사용하지 않는 서브모듈을 삭제할 때는 다음과 같은 명령어를 실행한다.
$ git rm -f [서브모듈 경로]
Bash
복사
위의 명령어 하나만으로 .gitmodules 파일에 등록된 서브모듈 정보와 서브모듈 폴더가 삭제된 것을 확인할 수 있다.
마찬가지로 git add 까지 자동으로 수행해주기 때문에 git commit 후 git push 를 하면 된다.
정상적으로 서브모듈이 삭제된 것을 확인할 수 있다.
참고자료
•
7.11 Git 도구 - 서브모듈 [git-scm]
•
[Git] Git Submodule에 대하여 [티스토리]
•