Git submodule

배추·2025년 4월 10일
0

생활코딩-Git

목록 보기
6/6

git의 submodule에 대해 알아봅니다.


▶module과 submodule

module 모듈

  • 모듈 module: 프로그래밍에서 재사용 가능한 코드의 단위.
  • 특정 기능을 독립적으로 구현해, 여러 프로젝트에서 공통으로 사용.
    • 예: 로그인, API 호출, 에러 처리 등

git의 submodule

  • git에서 저장소 안에 다른 저장소를 원하는 디렉토리에 복제하는 기능.
  • 공통 기능(=공통 모듈)을 별도의 저장소로 독립적으로 관리하고, 이를 각 프로젝트에서 submodule로 등록하여 참조해 사용할 수 있다.
    • 공통 모듈이 스스로 저장소로 존재.
    • 이 저장소를 원하는 특정 폴더에 연결 가능.
  • 공통 모듈의 특정 버전만 고정해서 사용 가능. 새 버전으로 업데이트 가능.

⇒ 프로젝트에 지금 필요한 모듈만 선택적으로 복제하여 사용하면, 전체 저장소 용량도 줄이고 관리 효율도 높일 수 있다.

▶예시를 통한 사용방법

예시 구조

super/                # 메인 저장소
├── lib/              # sub1 저장소가 들어갈 폴더
└── module/           # sub2 저장소가 들어갈 폴더
  • super 저장소는 sub1, sub2 저장소를 각각 lib, module 폴더에 submodule로 clone하여 사용한다.
  • 이렇게 하나의 저장소 안에 포함된 복제된 저장소들을 submodule이라고 한다.

🌟submodule 추가 방법

git submodule add submodule저장소주소 디렉토리명

git submodule add https://github.com/user/sub1.git lib 
# lib 디렉토리 안에 sub1저장소가 clone된다

git submodule add https://github.com/user/sub2.git module
# module 디렉토리 안에 sub2저장소가 clone된다
  • .gitmodules 파일 생성됨: 서브모듈의 저장소 주소와 경로 정보 포함.
  • submodule 저장소 주소 확인 방법: git remote -v

🌟submodule의 커밋/버전 상태 확인

  • git status, diff --cached: 현재 submodule(lib/module)이 어떤 커밋(버전)에 연결되어 있는지 확인.
  • git submodule
    • 숫자: 해당 submodule이 가리키는 커밋 해시.
    • +: 아직 그 커밋은 commit되지 않음.
  • git submodule summary: commit하지 않은 submodule 변경사항을 요약.

🌟submodule 업데이트

submodule이 업데이트 되었을때 그것을 반영시키는 법

개별 업데이트

  • 해당 저장소가 있는 폴더로 들어간다.
  • 그 안에서 git pull: 각 submodule은 독립된 저장소이기 때문에, 해당 디렉토리에서 직접 pull 가능.
cd lib
git pull

전체 업데이트 submodule update

  • git submodule update: 디렉토리에 연결된 현재 커밋으로 checkout.
  • git submodule update --remote: 연결된 원격저장소의 최신 커밋으로 checkout. 모든 submodlue을 한번에 업데이트.
  • git submodule update --remote --recursive: submodule의 하위 submodule까지 포함해서 모두 업데이트.

🌟여러 submodlue에 명령어 적용

git submodule foreach git 명령어: 각 submodlue에 동일한 명령 실행.

git submodule foreach git log --oneline
git submodule foreach "git log --oneline;ls -al"
# 여러 명령어를 입력하고 싶다면 ""필요

🌟submodule이 포함된 저장소를 clone할 때

기본 clone 시

git clone submodlue이포함된저장소주소

  • 기본 clone만 하면 submodule은 자동으로 clone되지 않음.
  • 따라서 명시적으로 clone해야한다.

submodule까지 같이 clone 시

clone 후 수동으로 초기화 및 업데이트

  • 1) 초기화 init
    • git submodule init: .gitmodules 기준으로 모든 submodule 정보 초기화.
    • git submodule init 특정submodule의path: 특정 submodule을 정보 초기화.
      • gitmodules에 해당 path가 있어야 함.
  • 2) 연결 update
    • git submodule update: 각 submodule을 .gitmodules에 명시된 커밋 버전으로 checkout.
git submodule init lib 
# 특정 서브모듈만 초기화 
# .gitmodules에 path = lib 가 있어야 정상 작동

git submodule update 
# 각 submodule을 지정된 버전으로 checkout

clone 시 처음부터 submodule 포함

git clone --recurse-submodules 저장소주소: 저장소와 함께 모든 submodule까지 자동으로 clone.

관련 파일

  • .gitmodules: 각각의 폴더가 어떤 저장소와 연결되어 있나를 정의.
    • 프로젝트에 포함된 모든 submodule의 정보를 담고 있음.
    • 버전정보는 포함되지 않음.
  • .git/config: 실제 clone된 submodule들의 정보 포함. 현재 연결된 커밋 버전 정보 포함.**
profile
난 🥬

0개의 댓글