-
Git 교과서 06 (서브모듈)Git Github 2021. 12. 16. 20:40
깃 호스팅 서비스들은 제공되는 저장소 용량을 제한한다. 보통 1GB 용량을 제공하기 때문에 파일 개수가 많은 프로젝트에서는 좀 더 효율적인 관리 방법이 필요하다.
규모가 큰 프로젝트는 필요에 맞게 작은 저장소로 분할하여 운영하는 것이 효율적이다. 이러한 저장소의 분할 개념을 서브모듈이라고 한다. 서브모듈은 저장소 하나가 다른 깃 저장소를 포함하는 형태를 의미한다.
요즘 규모가 큰 프로젝트는 모듈화하여 개발하는 추세다. 각 기능을 모듈화하여 독립 깃 저장소로 관리한다. 독립된 저장소는 모듈로서 다시 메인 저장소와 결합하여 재사용된다.
메인 저장소에는 서브 저장소가 여러 개 있다. 따라서 저장소 간 상하 관계가 발생한다. 보통 부모 저장소와 자식 저장소 형태로 나눈다.
원격 저장소로 동기화된 자식들은 언제든지 다른 프로젝트의 모듈별로 기능을 처리하고 결합할 수 있다.
서브모듈 추가
서브모듈은 2개 이상인 저장소를 부모와 자식 관계로 연결한다. submodule 명령어를 사용한다.
$ git submodlue -help
메인 저장소에 자식 저장소를 추가하는 옵션은 add 명령어다. 서브모듈로 저장소가 추가되면 메인 저장소는 서브 저자옷를 서브 폴더 형태로 취급한다.
$ git submodule add 원격저장소URL 폴더이름
설정 파일
처음으로 메인 저장소에 서브모듈이 등록되면 깃은 루트 위치에 설정 파일을 생성한다. 설정 파일은 메인 저장소와 연결된 자식 저장소들을 관리한다. 설정 파일 이름은 .gitmodules이다. (숨김 파일 형태로 관리한다.)
메인 저장소와 서브 모듈인 자식 저장소 간 관계를 지속적으로 유지하려면 추가된 정보들을 계속 가지고 있어야 한다. 메인 저장소가 자식들의 정보를 계속 가지려면 이를 커밋하여 저장해야 한다.
서브모듈 작업
부모 폴더(부모 저장소)에 생성된 자식 폴더 안에는 또 다른 .git 폴더가 있다. 서브모듈로 독립되었다는 뜻이다.
모듈로 등록된 child 폴더를 수정한 후, 메인 저장소의 상위 폴더에서는 status명령어로 상태를 추적하면 child 폴더만 변경했다고 출력한다. child 서브 폴더 안에는 자식 저장소의 변경된 파일만 추적하고, 상위 메인 저장소에서는 서브모듈의 저장소 자체를 추적한다.
parent/child 저장소의 내용을 수정 후 parent/childe 위치에서 커밋 후 원경 저장소로 전송했다면, 상위 메인 저장소의 서브 모듈도 변경된다. 즉, 서브모듈을 갱신하면 메인 저장소는 자신의 서브 폴더가 변경된 것을 인식한다. 이 변경 사항을 다시 커밋 후 전송해야 한다.
서브 모듈은 원격 저장소와 연결되어 있기 때문에 저장소마다 푸시해야 한다.
자식 저장소 갱신
자식 저장소와 메인 저장소에 등록된 저장소는 서로 다른 영역이다. 자식 저장소는 처음에 생성한 자식 저장소고, 메인 저장소에 등록된 parent/child 원격 저장소로 동기된 복제본이다.
따라서 자식 저장소에 연결된 원격 저장소를 이용하여 실제 자식 저장소를 최신 커밋 정보로 갱신해야 한다.
pull 명령어로 실제 자식 저장소를 최신 커밋 정보로 갱신한다.
ex) $ git pull origin master
반대로 실제 자식 저장소에서 코드를 수정하고, 이를 자식 저장소의 원격 저장소를 거쳐 부모 저장소의 서브모듈로 적용하는 방법은 간단히 부모 저장소의 폴더 위치에서(parent/chlid)에서 pull로 가져오면 된다.
부모 저장소 복제
서브모듈로 구성된 저장소는 부모/자식 관게를 맺는다. 서브모듈의 저장소를 복제하거나 배포할 때는 부모/자식 관계도 같이 복제해야 한다. clone 명령어로 메인 저장소를 복제할 경우 서브모듈 정보만 같이 복제할 뿐, 실제 하위 저장소는 같이 복제하지 않는다. 서브모듈의 하위 저장소는 직접 명령을 실행하여 가져와야 한다. 하위 저장소의 내용을 가져오려면 먼저 초기화와 갱신 작업을 해야한다.
$ git submodule init //서브모듈 초기화
$ git submodule update //서브모듈 업데이트
'Git Github' 카테고리의 다른 글
Git 교과서 05 (배포와 태그) (0) 2021.12.16 Git 교과서 04 (복귀) (0) 2021.12.15 Git 교과서 03 (병합과 충돌) (0) 2021.12.15 Git 교과서 02 (임시처리) (0) 2021.12.15 Git 교과서 01 (0) 2021.12.13