반응형

회사에서 git을 사용하지 않으니 이게 뭔가 한참을 헤맸다.

그래서 정리한다 다른 사람들은 조금 덜고생하라고..

 


SubModule이란?

: Git 저장소 안에 다른 Git 저장소를 디렉토리로 분리해 넣는 것으로 git의 다른 레파지토리를 참조할때 쓰는 형태

 

예를 들어 다른 프로젝트를 함께 사용해야 하는 경우 서로 별개로 다루면서도 그 중 하나를 다른 하나 안에서 사용할 수 있어야 할때 사용하는데 보통 라이러리 개발하고 가져다 쓸때, 다른 프로젝트의 직접 코드를 끌어와서 쓸때 등등 다양한 이유로 사용이 가능하다. 

 

 

사용방법

나는 아래의 내용을 가져다 쓰는 예시를 보여주겠다.

https://github.com/chafey/openjphjs

 

GitHub - chafey/openjphjs: OpenJPH wrapper for medical imaging

OpenJPH wrapper for medical imaging. Contribute to chafey/openjphjs development by creating an account on GitHub.

github.com

 

 

먼저 추가하고자하는 레포지토리로 가서 아래의 사진처럼 web url을 가져온다. 

 

 

아래 명령어를 사용하여 서브모듈을 추가한다.

git submodule add https://github.com/chafey/openjphjs.git

 서브모듈을 프로젝트에 포함하는 명령어로 나중에 다른 레포지토리가 필요할때 아래처럼 add 해주면 된다.

 

 

아래 명령어를 사용하여 서브모듈을 초기화한다. 

git submodule update --init --recursive

모르겠으면 서브모듈의 소스코드를 프로젝트로 가져오는 명령어라고 생각하면 된다.

  1. update: 저장소의 상태를 최신 버전으로 업데이트한다. 서브모듈의 커밋을 최신 커밋으로 변경하는 것을 의미.
  2. --init: 서브모듈을 초기화.이 단계에서는 .gitmodules 파일에 등록된 서브모듈의 정보를 읽어와 관련 설정을 초기화
  3. --recursive: 서브모듈 내에 또 다른 서브모듈이 있는 경우, 이를 모두 업데이트하고 초기화한다.

ChatGpt한테 물어보니까 이렇다는데 결론은  git submodule init 명령을 실행하면 서브모듈 정보를 기반으로 로컬 환경설정 파일이 준비되고 이후 git submodule update 명령으로 서브모듈의 리모트 저장소에서 데이터를 가져오고 서브모듈을 포함한 프로젝트의 현재 스냅샷에서 Checkout 해야 할 커밋 정보를 가져와서 서브모듈 프로젝트에 대한 Checkout을 함

 

 

git submodule 명령어와 관련된 주요 옵션

  1. add: 새로운 서브모듈을 추가
    • git submodule add <URL> [<path>]: 주어진 URL에서 서브모듈을 가져와 <path> 위치에 추가
  2. init: 저장소에 있는 서브모듈을 초기화
    • git submodule init: .gitmodules 파일에 있는 서브모듈을 확인하고 초기화
  3. update: 서브모듈을 업데이트
    • git submodule update [--init] [--recursive] [<path>]: 주어진 서브모듈을 업데이트
      • --init: 서브모듈을 초기화합니다.
      • --recursive: 서브모듈 내의 서브모듈도 재귀적으로 업데이트
  4. status: 서브모듈의 상태를 확인
    • git submodule status [<path>]: 서브모듈의 현재 상태를 보여줌
  5. sync: 서브모듈을 부모 저장소와 동기화
    • git submodule sync [<path>]: 서브모듈을 부모 저장소와 동기화
  6. foreach: 각 서브모듈에 대해 지정된 명령을 실행
    • git submodule foreach <command>: 각 서브모듈에 대해 <command>를 실행
  7. summary: 서브모듈 요약 정보를 표시
    • git submodule summary [<path>]: 서브모듈의 요약 정보를 표시
  8. deinit: 서브모듈을 해제
    • git submodule deinit [-f | --force] <path>: 주어진 서브모듈을 해제
  9. absorbgitdirs: 서브모듈 내부의 .git 디렉토리를 부모 저장소로 흡수
    • git submodule absorbgitdirs <path>: 서브모듈 내부의 .git 디렉토리를 부모 저장소로 흡수
  10. update-index: 서브모듈을 포함하는 상위 저장소의 인덱스를 업데이트
    • git update-index [--cacheinfo | --index-info] [--add | --remove | --replace | --skip-worktree | --no-skip-worktree | --intent-to-add] [--chmod=(+|-)x] [--force-remove] [--refresh] [--really-refresh] [--unresolve | --resolve | --unresolve-unmerged] [--again] [--info-only] [--ignore-missing] [--] [<file>]: 서브모듈을 포함하는 상위 저장소의 인덱스를 업데이트

 

 

 

[참고]

https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-%EC%84%9C%EB%B8%8C%EB%AA%A8%EB%93%88

반응형

+ Recent posts