본문 바로가기
Git

Git submodule 시작하기

by 신림쥐 2024. 9. 27.
728x90

 

     


    배경

    다른 프로젝트의 기능을 앱에 추가하는 방법으로 모노레포 방식을 사용할 수 있지만, 각 프로젝트를 독립적으로 관리해야 하는 경우에는 적합하지 않다.

    Git Submodule은 메인 프로젝트에서 외부 링크 형태로 서브 프로젝트를 연결해 두었다가, 필요할 때 최신 변경 사항을 가져와 작업한다.
    이 방식은 서브 프로젝트의 별도 사본을 만들지 않으며, 원래 저장소의 최신 상태를 유지하면서 개발을 진행할 수 있게 해줍니다.
    서브 프로젝트는 독립적으로 버전 관리를 유지하면서도, 메인 프로젝트와 쉽게 통합할 수 있습니다.

     

    main project와 submodule project 관계

    • main project에 submodule을 추가하여 사용한다.
    • main project에 root에 submodule들을 관리하기 위한 .gitmodules 파일이 생성된다.
    • main project는 submodule의 commit point를 바라보고 있다.
    main-project/
    ├ src/
    └ submodules/              # 서브모듈들을 모아두는 디렉토리
      ├── my-submodule/        # 서브모듈 디렉토리
      │   ├── .git/            # 서브모듈 전용 Git 관련 파일들
      │   ├── node_modules/    # 서브모듈의 의존성 패키지
      │   ├── src/             # 서브모듈의 소스 코드
      │   ├── package.json     # 서브모듈의 패키지 구성 파일
      │   ├── package-lock.json# 서브모듈의 패키지 잠금 파일
      │   └── README.md        # 서브모듈의 README 파일
      └── another-submodule/   # 다른 서브모듈 디렉토리 (옵션)
          ├── .git/            # 서브모듈 전용 Git 관련 파일들
          ├── node_modules/    # 서브모듈의 의존성 패키지
          ├── src/             # 서브모듈의 소스 코드
          ├── package.json     # 서브모듈의 패키지 구성 파일
          ├── package-lock.json# 서브모듈의 패키지 잠금 파일
          └── README.md        # 서브모듈의 README 파일

     

     

    Gir submodule 시작하기

    메인 프로젝트에 submodule 추가하기

    서브모듈로 사용할 프로젝트 터미널에서 remote 주소 조회

    $ git remote -v

     

    메인 프로젝트에 github_url(서브 프로젝트 remote 주소) 추가

    // git submodule add -b [브랜치명] [git url]
    git submodule add -b master https://github.com/react-template.git react-app/submodules/template

     

    서브모듈 상태 확인

    $ git submodule status

     

     

    메인 프로젝트 Clone

    깃에서 프로젝트 clone시 서브모듈은 폴더만 가져오고 파일을 가져오지 않는다. 직접 서브모듈을 가진 프로젝트 clone하여 가져와야 한다.

    $ git clone <git_url>
    
    // 한번에 하고 싶은 경우
    git clone --recurse-submodules <git_url>

     

    서브모듈 저장소 초기화 및 업데이트

    // $ git submodule init <folder_name 생략가능>
    $ git submodule init
    $ git update

     

    submodule 버전 확인하기

    서브모듈 커밋ID의 최신 버전여부를 확인하고 싶은 경우 github 마지막 커밋ID와 서브모듈 콘솔 버전을 비교하면 된다.

    $ git submodule status
    // b94fd8e91242a630811f234e00d5b30422a665a1 template (v0.0.0.0-153-gb94fd8e)

     

    메인 프로젝트에서 서브 프로젝트 커밋ID(버전) 조회

    $ git log --oneline

     

    메인 프로젝트 커밋되지 않은, origin 서브 프로젝트에 최신 버전을 알고 싶을때

    git submodule summary

     

    메인 프로젝트 submodule 버전 업데이트

    서브모듈 프로젝트의 최신 commit ID와 서브모듈 버전을 확인한다

    $ git status

     

    메인 프로젝트에서 서브모듈 업데이트 명령어를 실행한다. update시 서브모듈에 작업 merge가 되어 있지 않다면 기존에 작업한 내용이 날라갈 수 있으니 주의해야한다.

    // .gitmodules에 설정된 URL(remote)로 연결된 저장소에 최신 커밋 시점으로 checkout
    $ git submodule update --remote
    
    // --remote가 붙어있지 않다면 메인 프로젝트에 submodule이 가진 커밋ID 시점으로 checkout
    // $ git submodule update

     

    서브모듈 작업 업데이트하여 원격 저장소에 반영한다.

    // 메인 프로젝트안에 추가된 서브 프로젝트 root까지 이동
    $ git pull
    $ git add .
    $ git commit -m "Update submodule"
    $ git push origin master

     

    메인 프로젝트 submodule 특정 커밋 ID 버전 업데이트

    서브모듈 디렉토리로 이동합니다.

    $ cd path/to/your/submodule

     

    특정 태그의 커밋 ID 또는 tag 를 사용하여 체크아웃

    // git checkout <commit-id>
    $ git checkout b5ee5c3c6c4e54c8a9d43b6fb3e85386df60724e
    
    // git checkout tags/<tag-name>
    $ git checkout tags/v1.0.0.0

     

    변경된 내용을 메인 프로젝트와 함께 원격저장소로 commit, push

    cd - git add path/to/your/submodule 
    git commit -m "Update submodule to tag <tag-name>"

     

    submodule 삭제

    Git 캐시까지 같이 삭제해준다.

    // git submodule deinit -f [submodule 디렉토리]
    git submodule deinit -f react-app/submodules/template 
    
    // git rm -f [submodule 디렉토리]
    git rm -f react-app/submodules/template 
    
    // rm -rf .git/modules/[submodule 디렉토리]
    rm -rf .git/modules/react-app/submodules/template 
    
    // rm '[submodule 디렉토리]'
    rm 'react-app/submodules/template '
    728x90