[Git] 11장 서브모듈
- 버전관리
- 2022. 6. 25. 04:33
참조
대형 프로젝트
- 깃은 작은 프로젝트부터 대용량 프로젝트까지 관리할 수 있는 버전 관리 도구입니다.
- 깃은 작은 프로젝트뿐만 아니라 큰 규모의 프로젝트도 관리하기 쉽도록 저장소를 여러 개 이용하여 단일 프로젝트를 진행할 수 있습니다.
저장 용량
- 깃 저장소는 용량 한계가 없습니다.
- 컴퓨터의 하드디스크에서 지원하는 용량만큼 깃 저장소를 생성할 수 있습니다.
- 또 깃은 파일을 기반으로 데이터베이스를 관리합니다. 하지만 저장소 크기가 너무 크면 컴퓨터에 부담을 줍니다.
- 이러한 이유로 깃 호스팅 서비스들은 제공되는 저장소 용량을 제한합니다.
- 보통 1GB 용량을 제공하기 때문에 파일 개수가 많은 프로젝트에서는 좀 더 효율적인 관리 방법이 필요합니다.
저장소 분리
- 규모가 큰 프로젝트는 저장소 용량이 많이 필요합니다.
- 또 단지 용량이 크기만 한 저장소는 비효율적입니다.
- 필요에 맞게 작은 저장소로 분할하여 운영하는 것이 좀 더 효율적입니다.
- 깃 역시 큰 규모의 저장소를 작은 저장소로 나누어 관리할 수 있습니다.
- 즉, 저장소 하나를 작은 저장소 몇 개로 분할할 수 있다는 의미입니다.
- 이러한 저장소의 분할 개념을 서브모듈 이라고 합니다.
- 서브모듈은 저장소 하나가 다른 깃 저장소를 포함하는 형태를 의미합니다.
- 이러한 서브모듈 개념을 적용하면 대형 프로젝트도 효과적으로 관리할 수 있습니다.
상하 관계
- 요즘 규모가 큰 프로젝트는 모듈화하여 개발하는 추세입니다.
- 각 기능들을 모듈화하여 독립된 깃 저장소로 관리합니다.
- 그리고 독립된 깃 저장소는 모듈로서 다시 메인 저장소와 결합하여 재사용합니다.
- 메인 저장소에는 서브 저장소가 여러 개 있습니다. 따라서 저장소 간 상하 관계 가 발생합니다.
- 보통 부모 저장소와 자식 저장소 형태로 나눕니다.
- 부모 자식 관계로 분리된 로컬 저장소는 또 다시 개별 원격 저장소와 연결됩니다.
- 원격 저장소로 동기화된 자식들은 언제든지 다른 프로젝트의 모듈별로 기능을 처리하고 결합할 수 있습니다.
실습을 위한 저장소 준비
- 서브모듈을 테스트하려면 저장소 2개가 필요합니다.
- 먼저 로컬 컴퓨터에 깃 저장소를 2개 생성하고, 원격 저장소도 2개 생성하여 각 로컬 저장소와 연결합니다.
서브모듈 추가
- 두 저장소를 생성하고 원격 저장소와 연결하여 서브모듈 실습 환경을 준비했습니다.
- 서브모듈은 2개 이상인 저장소를 부모와 자식 관계로 연결합니다.
- 저장소를 모듈로 연결하려면 submodule 명령어 를 사용합니다.
- submodule 명령어 는 옵션을 사용하여 다양한 동작을 실행할 수 있습니다. 자세한 옵션은 -help 명령어로 확인합니다.
$ git submoduel -help
저장소 연결
- 메인 저장소에 자식 저장소를 연결합니다.
- 메인 저장소에 자식 저장소를 추가하는 옵션은 add 명령어입니다.
- 서브모듈로 저장소가 추가되면 메인 저장소는 서브 저장소를 서브 폴더 형태로 취급합니다.
$ git submodule add 원격저장소URL 폴더이름
$ git submodule add child 자식 저장소 등록
Cloning into ‘E:/gitstudy11_parent/gitstudy11_child’… 저장소 복제
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
warning: LF will be replaced by CRLF in .gitmodules.
The file will have its original line endings in your working directory
설정 파일
- 처음으로 메인 저장소에 서브모듈이 등록되면 깃은 루트 위치에 설정 파일을 생성합니다.
- 설정 파일은 메인 저장소와 연결된 자식 저장소들을 관리합니다.
- 설정 파일 이름은 .gitmodules 입니다. 파일 이름이 점(.) 으로 시작되기 때문에 숨김 파일 형태로 관리합니다.
$ git cat .gitmoudles --------서브모듈 설정 파일
$ cat .gitmodules 서브모듈 설정 파일
[submodule “child”]
path = child 폴더 이름
url = 원격 주소 URL
모듈 커밋
- 서브모듈 명령을 실행하여 메인 저장소에 자식 저장소를 연결했습니다.
- 서브모듈이 추가된 부모 저장소의 상태를 확인해 보겠습니다. status 명령어를 입력합니다.
- 앞에서 확인했듯이, 메인 저장소에 자식 저장소의 폴더와 환경 설정 파일을 생성했습니다.
- 메인 저장소와 서브모듈인 자식 저장소 간 관계를 지속적으로 유지하려면 추가된 정보들을 계속 가지고 있어야 합니다.
- 메인 저장소가 자식들의 정보를 계속 가지려면 이를 커밋하여 저장해야 합니다.
$ git add .gitmodules --------- 등록
$ git commit -m “add submodule” 커밋
[master 7a6d131] add submodule
2 files changed, 4 insertions(+)
create mode 100644 .gitmodules
create mode 160000 child
서브모듈 작업
- 메인 저장소를 서브모듈 형태로 변경했습니다.
- 메인 저장소에는 서브 저장소의 연결 정보만 있습니다.
- 메인 저장소에 등록된 서브 저장소는 독립된 별도의 저장 공간입니다.
자식 저장소
- 자식 저장소와 메인 저장소에 등록된 저장소는 서로 다른 영역입니다.
- 자식 저장소는 처음에 생성한 자식 저장소고, 메인 저장소에 등록된 parent/child 원격 저장소로 동기된 복제본입니다.
- 따라서 서로 다른 두 저장소는 아직 동일한 커밋 정보를 가지고 있지 않습니다.
- 자식 저장소에 연결된 원격 저장소를 이용하여 실제 자식 저장소를 최신 커밋 정보로 갱신해야 합니다.
부모 저장소 복제
- 서브모듈로 구성된 저장소는 부모/자식 관계를 맺습니다.
- 서브모듈의 저장소를 복제하거나 배포할 때는 부모/자식 관계도 같이 복제해야 합니다.
부모 저장소 복제
$ cd 실습폴더
$ git clone gitstudy11 복제
Cloning into ‘gitstudy11’…
remote: Enumerating objects: 8, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 8 (delta 0), reused 8 (delta 0), pack-reused 0
Unpacking objects: 100% (8/8), done.
모듈 업데이트
- 메인 저장소를 복제할 때는 서브모듈 정보만 같이 복제할 뿐, 실제 하위 저장소는 같이 복제하지 않습니다.
- 서브모듈의 하위 저장소는 직접 명령어를 실행하여 가져와야 합니다.
- 하위 저장소의 내용을 가져오려면 먼저 초기화와 갱신 작업을 해야 합니다.
- 서브모듈 update 옵션으로 관련 하위 저장소를 복제합니다.
부모 저장소 업데이트
- 메인 저장소는 서브모듈 형태로 구성되어 있습니다.
- 부모 저장소도 별도로 관리하므로 갱신이 필요합니다.
부모 업데이트
- 서브모듈 형태로 구성된 부모/자식 저장소도 커밋을 갱신합니다.
- 새로운 하위 저장소를 추가하거나 하위 저장소를 갱신할 때 메인 저장소의 설정 파일과 폴더가 변경되기 때문입니다.
- 따라서 자식 저장소에 코드 수정으로 커밋이 발생하면, 부모에도 자연스럽게 새로운 커밋이 발생합니다.
- 갱신된 메인 저장소 내용을 정기적으로 갱신하여 서브모듈 상태를 최신으로 유지해야 합니다.
부모 저장소로 풀
- 하위 저장소에 새로운 커밋이 생성되면 메인 저장소는 이를 반영합니다.
- 메인 저장소에는 반영한 하위 저장소의 변경된 내용 때문에 추가 커밋이 발생합니다.
- 자신이 메인 저장소를 복제하여 운영하고 있다면, 메인 저장소를 주기적으로 풀(pull) 작업해 주어야 합니다.
- 하지만 부모 저장소를 pull 했다고 해서 부모 저장소에 종속된 모든 서브 저장소까지 자동으로 갱신되지는 않습니다.
- 다음과 같이 서브모듈의 업데이트는 별도로 명령어를 실행해 주어야 합니다.
$ git submodule update
정리
- 서브모듈은 규모가 큰 저장소를 작은 저장소 여러 개로 분리하여 운영할 수 있게 합니다.
- 또 서브모듈은 큰 프로젝트를 쪼개서 작은 프로젝트로 만들고, 저장소 크기를 줄여 가볍게 저장소를 운영할 수도 있습니다.
- 서브모듈 형태로 코드를 분리하면 다른 프로젝트에서도 모듈을 재사용할 수 있는 장점이 있습니다.
- 또 각 모듈을 원격 저장소와 연결해서 협업하여 개발은 진행할 수도 있습니다.
728x90
'버전관리' 카테고리의 다른 글
[맥북]맥OS M1 git 설치하기 (2) | 2023.01.11 |
---|---|
[Git] 12장 고급기능 (0) | 2022.06.25 |
[Git] 10장 배포 관리와 태그 (0) | 2022.06.24 |
[Git] 9장 복귀 (0) | 2022.06.20 |
[Git] 8장 병합과 충돌 (0) | 2022.06.20 |
이 글을 공유하기