EtoC

Git SubModule 본문

ETC/Git&GitHub

Git SubModule

게리드 2023. 8. 3. 11:38

오늘 오전 미팅에서 우리가 해야할 업무와 협업툴에대해 알려주셨다.
git 서브모듈을 사용해야하는것은 알았지만 막상 사용하려니 굉장히 헷갈렸고 팀원과 서로 다른얘기하고 "에..?" 했다.
그래서 오전시간에는 git 서브모듈에 대해 각자 공부해보기로했다.

공식문서에 git submodule을 시작하는 방법이 잘 정리되어있었다.

 

 

Git - 서브모듈

gitmodules 파일에 있는 URL은 조건에 맞는 사람이면 누구든지 Clone 하고 Fetch 할 수 있도록 접근할 수 있어야 한다. 예를 들어 다른 사람이 Pull을 하는 URL과 라이브러리의 작업을 Push 하는 URL이 서로

git-scm.com

 

 

서브모듈을 사용하는 이유는 프로젝트를 수행하다 보면 다른 프로젝트를 함께 사용해야 하는 경우가 발생하는데,
함께 사용할 프로젝트가 외부에서 개발한 라이브러리이거나 내부의 여러 프로젝트에서 공통으로 사용할 라이브러리일 경우가 있다.
이때 두 프로젝트를 서로 별개로 다루면서도 그 중 하나를 다른 하나 안에서 사용할 수 있도록하는 도구가 git submodule이다.

회사에서는 모두가 같은 에디터를 사용하기를 원해서 서브모듈을 사용하게 되었다고 한다.

1. Git 서브모듈이란?

Git Submodule은 Git 저장소 내에서 다른 Git 저장소를 포함하는 방법을 제공하는 Git의 도구이다.
쉽게말해 git 레포지토리의 하위에 다른 레포지토리를 관리하기위한 git의 도구이다.
이때 상위 레포지토리를 슈퍼프로젝트(superproject), 하위 레포지토리를 서브모듈(submodule)이라 한다.

2. 사용 이유

  • 외부 라이브러리:
    프로젝트에서 외부 라이브러리를 사용해야 할 때, 해당 라이브러리를 Git 저장소로 관리하고, 프로젝트의 Git 저장소 내에 서브모듈로 포함시켜 사용하기 위해 사용한다.
  • 공유 코드:
    여러 프로젝트에서 공통으로 사용되는 코드가 있는 경우, 해당 코드를 별도의 Git 저장소로 유지하고, 다른 프로젝트의 Git 저장소 내에 서브모듈로 포함시켜 공유하기위해 사용한다.

3. 서브모듈 추가하기

1. 서브모듈 추가

git submodule add 명령을 사용하여 새로운 서브모듈을 추가한다.

2. 서브모듈 업데이트

서브모듈을 업데이트하려면 부모 저장소의 디렉토리에서 git submodule update --remote 명령을 사용한다.

3. 서브모듈 커밋

서브모듈에서 변경사항을 커밋하려면 해당 서브모듈 디렉토리로 이동하여 Git 명령을 사용한다.

4. 부모 저장소에서 서브모듈 삭제

git rm --cached 명령을 사용하면 부모 저장소에서 서브모듈을 삭제할 수 있다.

주의사항

서브모듈을 포함하여 저장소를 복제할 때는 git clone --recurse-submodules 명령을 사용하여 서브모듈도 함께 클론해야 한다.

  1. Submodule의 의존성 관리시
    Submodule을 사용하면 프로젝트 내의 다른 저장소를 참조하게되는데, Submodule의 변경사항이 프로젝트의 변경에 영향을 미칠 수 있다.
    때문에 Submodule을 업데이트할때는 해당 Submodule의 최신 버전이 프로젝트와 호환되는지 확인해야한다.
  2. Submodule 업데이트시
    Submodule은 프로젝트와다른 Submodule의 자체 저장소를 가지고있다. 이 둘은 서로 다른 저장소를 가지고있기 때문에 Submodule의 최신 버전을 가져오려면 프로젝트의 Submodule 폴더로 이동하여 해당 Submodule의 업데이트를 직접 수행해야한다.
  3. 커밋과 브랜치 관리
    Submodule의 커밋과 프로젝트의 커밋이 독립적으로 관리되기때문에 프로젝트를 커밋할 때 Submodule의 상태는 함께 기록되지 않는다.
    submodule과 프로젝트 두곳 모두 커밋을 해야한다. 이렇게 하지 않으면 프로젝트의 릴리스 버전과 Submodule의 버전 간의 관리가 복잡해진다.
  4. 코드 Merge 시
    Submodule을 사용하는 프로젝트를 다른 브랜치로 병합할 때 충돌이 발생할 수 있다.
    주로 submodule 변경사항이 충돌하거나 submodule최신버전이 적용되지않는 문제가 있다.
  5. 충돌발생시 권장사항은 아래와 같다.
    1.submodule을 업데이트하여 최신버전을 가져온다.(최신버전 적용 불가시)
    2.merge시 submodule의 변경사항이 충돌을 일으킬 경우, 충동을 해결하고 최신버전으로 유지하기.
    3.새로운 브랜치를 만들거나 병합전에 submodule을 초기화하기
    4.submodule의 업데이트르 자동화하는 스크립트를 사용하여 브랜치간의 submodule을 관리한다.
    5.submodule의 변경사항을 테스트하여 병합전에 문제를 발견하고 해결하자.
  6. 권한 문제 발생시
    Submodule은 서브모듈 저장소에 대한 읽기/쓰기 권한이 필요하기때문에, 각각의 접근권한을 확인하여 적절한 권한이 부여되어있는지 확인해야한다.
  7. 초기화와 업데이트
    Submodule을 사용하려면 초기화 단계와 업데이트 단계를 거쳐야한다. 초기화를 제대로 하지 않으면 Submodule이 올바르게 동작하지 않을 수 있다.

간단하게 submodule에대해 공부해보았다.

서브모듈과 연동하기위해 아래의 명령어를 입력하였다.

git submodule update --init

위 명령어는 submodule을 초기화하고 업데이트 하는 명령어이다.

--init 옵션은 서브모듈을 초기화한다.(서브모듈 디렉토리를 생성하고 서브모듈의 저장소의 URL과 커밋들을 가져온다.)
update명령은 서브ㅡ모듈을 업데이트한다. (서브모듈이 초기화상태라면 최신커밋으로 업데이트한다.)

그런데 음..

아래에 있는 in-editors가 자꾸 생성되는데 이게 최신버전과 관계가 있는걸까?

 

일단 강제푸쉬를 하지않고 다른 방법들을 시도해보다가 사수님께 발생한 문제와 시도한 방법들, 우리가 강제푸쉬를 해도되는지 질문을 드리니 원인은 회사에 다른분이 새로운 기능을 추가하였는데 회사쪽에서 아직 머지가 되지않아서 회사에서 처리해야한다고 알려주셨다. 

강제푸쉬는 절대안된다고 하셨다.

역시 강제푸쉬는 위험해..

모르는 것은 정리해서 빠르게 질문페이지 만들어서 질문드리니 잘했다고 칭찬해주셨는데 뿌듯했다 ㅎㅎ