헬창 개발자

종속성 관리 - 서브모듈, 서브트리 본문

공부방

종속성 관리 - 서브모듈, 서브트리

찬배 2025. 6. 17. 15:20

Submodule과 Subtree를 활용한 외부 종속성 관리 및 프로젝트 통합

이 문서에서는 SubmoduleSubtree를 활용하여 외부 종속성의 코드를 안정적으로 관리하고, 이를 프로젝트에 효과적으로 통합하는 방법을 다룹니다.


1. Submodule

목적

  • 하나 이상의 외부 저장소를 현재 저장소에 링크 형태로 포함시키기 위해 사용
  • 예: 프로젝트 A 안에 외부 저장소 B를 독립적인 버전 상태로 포함 가능

작동 방식

  • 부모 저장소는 서브모듈이라 불리는 외부 저장소에 대한 참조(링크)만 유지
  • 서브모듈은 독립적인 Git 저장소로 관리되며, 별도의 .git 디렉토리를 가짐
  • 부모 저장소는 서브모듈의 특정 커밋 해시만 기록함

2. Subtree

목적

  • 외부 저장소의 코드를 현재 저장소에 복사하여 포함시키기 위해 사용
  • 하나의 Git 저장소 안에서 통합적으로 버전 관리할 수 있음

작동 방식

  • 외부 저장소의 특정 디렉터리를 가져와서 현재 저장소에 병합
  • 이 과정에서 외부 저장소의 커밋 히스토리도 함께 반영됨

1. Submodule과 Subtree 적용 실습

Submodule과 Subtree를 실제 프로젝트에 적용하여, 외부 코드를 어떻게 통합하고 관리하는지 직접 확인해보겠습니다.


2. 프로젝트 구조 설정

  1. 클라이언트 프로젝트와 서버 프로젝트를 위한 디렉토리를 각각 생성합니다.
  2. 각 디렉토리에서 Git 저장소를 초기화합니다.
    git init
  3. 두 저장소에 간단한 예제 코드를 작성합니다.

3. Submodule 적용하기

3-1. Submodule 추가

클라이언트 프로젝트에 서버 프로젝트를 서브모듈로 추가합니다.

git submodule add <lib_repository_url> <path>
  • <path>: 클라이언트 프로젝트 내에서 서브모듈을 둘 디렉토리 경로

3-2. Submodule 초기화

git submodule update --init --recursive

3-3. Submodule 동기화

서버 프로젝트 변경 사항을 가져와 최신 상태로 유지합니다.

# 특정 서브모듈만 업데이트
git submodule update --remote <path>
# 전체 서브모듈 업데이트
git submodule update --remote

💡 서버 프로젝트 변경 시, 해당 디렉토리에서 직접 커밋 및 푸시 후 클라이언트 프로젝트에서 업데이트해야 합니다.

서브 모듈추가 시 별도의 레파지토리가 생긴다.

test_fd : 프로젝트 디렉터리

commons : 서브모듈 디렉터리

 

 

서브모듈을 커밋 후에 git을 가서 확인하면 @로 참조가 된걸 확인이 가능하다.


4. Subtree 적용하기

4-1. Subtree 추가

git subtree add --prefix=<path> <lib_repository_url> master
  • <path>: 클라이언트 프로젝트 내에 통합될 서버 프로젝트 디렉토리

4-2. Subtree 업데이트 및 변경 사항 반영

  • 클라이언트 프로젝트에서 서버 코드 변경 후 커밋하면, 해당 변경 사항도 함께 관리됩니다.
  • 서버 프로젝트에 변경 내용을 다시 푸시할 수도 있습니다.
git subtree push --prefix=<path> <lib_repository_url> master

 

서브트리 생성 시 다음과 같은 로그가 적용된다.


5. 결과 확인

Submodule 적용 결과

  • 서버 프로젝트를 분리된 Git 저장소로 관리하면서, 클라이언트 프로젝트 내에서 API를 사용할 수 있습니다.
  • git submodule update로 서버 프로젝트 변경 사항을 동기화합니다.

Subtree 적용 결과

  • 서버 프로젝트 코드가 클라이언트 프로젝트에 직접 통합됩니다.
  • 클라이언트에서 서버 코드를 직접 수정하고, 필요 시 서버 저장소로 변경 사항을 다시 푸시할 수 있습니다.

'공부방' 카테고리의 다른 글

Hash Ring  (1) 2025.07.03
Sync/Async & Blocking/Non-blocing  (2) 2025.06.30
메시지 브로커(Redis)와 Celery  (0) 2025.05.29
docker health check  (0) 2025.05.09
논문 리뷰: s1: Simple test-time scaling  (1) 2025.02.18
Comments