[Git] 11장 서브모듈

참조

대형 프로젝트

  • 깃은 작은 프로젝트부터 대용량 프로젝트까지 관리할 수 있는 버전 관리 도구입니다.
  • 깃은 작은 프로젝트뿐만 아니라 큰 규모의 프로젝트도 관리하기 쉽도록 저장소를 여러 개 이용하여 단일 프로젝트를 진행할 수 있습니다.

저장 용량

  • 깃 저장소는 용량 한계가 없습니다.
  • 컴퓨터의 하드디스크에서 지원하는 용량만큼 깃 저장소를 생성할 수 있습니다.
  • 또 깃은 파일을 기반으로 데이터베이스를 관리합니다. 하지만 저장소 크기가 너무 크면 컴퓨터에 부담을 줍니다.
  • 이러한 이유로 깃 호스팅 서비스들은 제공되는 저장소 용량을 제한합니다.
  • 보통 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

이 글을 공유하기

댓글

Designed by JB FACTORY