서브 모듈

대형 프로젝트

큰 규모의 프로젝트 일 수록 관리가 어렵습니다. 이를 위해 깃에서는 저장소 분리를 통해 관리를 쉽게 하고자 합니다.

  • 저장소 분리
    • 서브모듈은 저장소 하나가 다른 깃 저장소를 포함하는 형태를 의미합니다.
    • 작게 나뉜 모듈 형태의 저장소는 다른 프로젝트에서도 재사용할 수 있습니다.
  • 저장소의 상하 관계가 생겨, 부모 저장소와 자식 저장소로 나뉩니다. 원격 저장소로 동기화 된 자식들은 언제든지 다른 프로젝트의 모듈 별로 기능을 처리하고 결합할 수 있습니다.

서브모듈의 추가

  • 서브모듈 명령어를 통해 추가할 수 있다.
$ git submodule -help // 도움말 사용
$ git submodule add 원격저장소URL 폴더이름
  • 부모 프로젝트 내부에서 아래와 같은 명령어를 통해 해당 경로에 서브 모듈을 추가한다.
$ git submodule add https://github.com/Chiptune93/git.submodule-child.example child
  • 서브 모듈 추가 후 상태

Untitled

  • 설정 파일
    • 서브모듈이 등록되면 깃은 루트 위치에 설정 파일을 생성합니다.
    • 파일 이름은 .gitmodule 이며, 숨김 처리가 되어있습니다.
  • 모듈 커밋
    • 설정 파일을 add 하여 commit 합니다.
    • 자식 저장소와 관계를 유지하려면 추가된 정보를 계속 커밋하여 저장해야 합니다.
  • 서브모듈 저장소의 구조

Untitled

서브모듈 작업

  • 모듈 저장소
    • 서브모듈로 생성된 폴더 내부에 .git 파일과 함께 서브 저장소의 내용이 들어 있습니다.
  • 모듈 상태
    • 이후, 메인 저장소 내 서브모듈 위치에서 작업 후 메인 저장소로 이동 뒤, 상태를 보면 서브모듈 폴더만 변경 되었다고 출력합니다.
    • 서브모듈 내에서는 자식 저장소의 변경된 파일만 추적하고, 상위 메인 저장소에서는 서브모듈의 저장소 자체를 추적합니다.
  • 모듈 커밋
    • 서브모듈 내 폴더에서 커밋을 합니다.
    • 이 때 커밋을 한 상태는 메인 저장소에서 하위로 복제된 자식 저장소에만 커밋하는 것이며 상태는 아래와 같습니다.

      Untitled

    • 커밋으로 메인 저장소 안에 있는 복제된 자식 저장소가 깨끗한 상태입니다. 복제된 자식 저장소에만 커밋 했을 뿐 수정한 내용을 자식의 원격 저장소에는 아직 전송하지 않았습니다.
  • 부모 커밋
    • 이 때, 메인 저장소로 이동하여 상태를 살펴보면, 서브모듈 폴더인 child 만 수정 되었다고 나옵니다.
    • 커밋을 하여 변경 내용을 기록한 후, push 하면 메인 저장소 동기화가 완료 됩니다.

      메인과 서브모듈은 각각의 원격저장소에 관리된다.

      메인과 서브모듈은 각각의 원격저장소에 관리된다.

자식 저장소 갱신

  • 자식 저장소
    • 자식 저장소의 관계도

    Untitled

  • 자식 저장소의 갱신
    • 자식 저장소 자체로 이동하여(서브모듈 폴더X) 변경을 갱신하게 되면 아래와 같은 상태가 된다.

      Untitled

  • 자식 저장소 작업
    • 자식 저장소에서 작업을 하고 갱신을 한 뒤, 원격 저장소로 전송한다.
    • 이 자체로는 그냥 자식 저장소에서 작업이 진행된 것이다.
  • 부모 저장소 적용
    • 자식 저장소에서 작업한 변경 내용을 부모 저장소에서 적용한다.
    • 부모 저장소에서 서브모듈 폴더로 이동한 뒤, pull을 받으면 자식의 원격 저장소에서 변경 내용을 서브모듈 폴더 내부에 받게 된다.
  • 부모 저장소 갱신
    • 자식 저장소의 원격 저장소를 이용해 메인 저장소의 서브모듈을 갱신하였다.
    • 메인 저장소는 서브모듈의 변경 내용을 모니터링 하고 있는 것과 같다.

부모 저장소 복제

위에 작업한 내용들이 존재하는 상황에서 새 폴더에서 메인 저장소를 clone 받는다.

서브 모듈 설정 파일만 존재하고, 폴더만 생성하기 때문에 서브모듈 폴더에는 아직 아무 내용이 없다.

  • 모듈 업데이트
    • 서브 모듈을 우선 초기화 시킨 후, 내용을 업데이트 한다.

      $ git submodule init // 초기화
      $ git submodule update // 서브모듈 정보를 기준으로 내용 업데이트
      
    • 서브모듈 초기화 및 업데이트 시, 진행 상황

    Untitled

부모 저장소 업데이트

  • 부모 업데이트
    • 서브모듈 형태로 구성된 부모/자식 저장소도 커밋을 갱신이 가능하며, 주기적으로 갱신하여 서브모듈 상태를 최신으로 유지해야 한다.
  • 부모 저장소로 풀
    • 하위 저장소에 새로운 커밋이 생성되면 메인 저장소에서는 이를 반영한다.
    • 부모 저장소를 최신으로 유지하고 있다고 해도, 종속된 모든 서브 저장소까지 자동으로 갱신 되지는 않는다. 따라서, 서브모듈의 업데이트는 별도로 명령을 실행해 주어야 한다.

© 2024. Chiptune93 All rights reserved.