프로젝트/협업 프로젝트(2023.12.18-2024.01.25)

[Key Word 개발기] Git submodule

dal_been 2024. 1. 19. 22:03
728x90

배포하면서 개발을 하다보면 yml에 추가해야하는 설정들이 있다. 공개해도 되는 값이면 괜찮지만 공개하면 안되는 값들은

 

  datasource:
    url: jdbc:mariadb://${DB_HOST}:${DB_PORT}/${DB_DATABASE}

 

이런 형식으로 작성후 쉘스크립트에서 export하여 넣어주고 있다.

이러다보니 매번 쉘스크립트를 수정하는 것이 귀찮았다... 그래서 더 나은 방법이 없을까?? 찾아보니 git submodule이라는 방법이 있었다.

 


서브 모듈??

 

Git 레포지토리 내에 다른 Git레포지토리를 포함하는 방법이다. 상위 레포를 슈퍼 프로젝트, 하위 레포를 서브 모듈이라고 부른다. 

서브모듈을 이용하면 어느 Git 레포에 하위 디렉토리로 사용가능하다.

 

보통 서브모듈의 경우 공통으로 사용되는 부분을 서브모듈로 만든다. 

다만 주의할 점이 서버모듈에서 변경된 사항이 상위레포에 바로 반영되지 않는다.  상위레포에서 서브모듈이 존재하는 디렉토리로 들어와서 pull을 통해 최신버전을 가져와야한다. 

 

 

간단하게 적용하는 방법을 말해보겠다.

 

서브 모듈 등록

일단 레포두개를 만든다. super와 submodule로 만든다.

super 레포지토리 디렉토리로 이동한 다음 아래 명령어를 통해 서브 모듈을 등록한다

$ git submodule add https://github.com/dev/submodule.git lib

 

하면 super레포 디렉토리 lib에 submodule 레포가 클론 되고 서브무듈로 등록된다.

 

 

.gitmodules

서브 모듈을 추가하면 .gitmodule라는 파일이 생성된다. 어느 디렉토리에 서브 모듈 저장소 url이 매핑되어있는지 담겨져있다.

 

서브모듈 자세히

git diff

- > Git 디렉토리에서 파일이 변경된 내용을 확인할 수 있다. 

- > --cached 옵션은 아직 커밋되지 않고, 스테이지에 올라간 파일 대상으로 변경내용을 확인하다.

git diff --cached lib

 

git log라는 명령어를 통해서 위의 명령어에 커밋해시와 동일한 커밋해시를 찾을 수 있다.

 

서브모듈 변경사항 super레포에 반영

간단하게 서브모듈에 변경사항을 주보자

$ touch abc
$ git add .
$ git commit -m "second commit"
$ git push origin main

 

이후 다시 super레포 디렉토리로 가서 git pull을 하면 당연히 변경된 내용을 가져오지 않는다. 위에서 말했드시 lib디렉토리로 들어가서 pull해와야한다.(lib은 super레포와 독립적인 저장소이기 때문)

 

$ cd lib
$ git pull

 

그러면 abc라는 파일이 생성된 것을 확인할 수 있다. 다시 git diff를 쳐보면 커밋 해시가 변경된 것을 볼 수 있다.

 

근데 매번 그러면 서브모듈이 있는 디렉토리에 들어가서 pull해와야하는가..?? 아니다. 더 간단한 명령어가 있다.

다시 서브모듈로 가서 abcd라는 파일을 생성하고 커밋하고 푸시해보자. 그리고 슈퍼 레포 디렉토리로 이동하여 다음 명령어를 입력하자

 

$ git submodule update --remote

 

그럼 아주 간단하게 서브모듈의 최신 커밋을 가져올 수 있다. 

 

그리고 마지막으로 슈퍼 레포에서 서브모듈의 변경사항을 add, commit하여 원격저장소로 push해야한다.

 


앞서 말했드시 공통적으로 사용되는 부분을 서브모듈로 관리할 수  있다. 또한 민감한 정보 데이터베이스 비밀번호, jwt 시크릿티등을 서브모듈로 관리가능하다. 뿐만 아니라 깃 처럼 형상관리가 가능해져 언제 수정하였고 첨가되었는지도 파악할 수 있다

 

https://velog.io/@appti/Jenkins-Git-Submodule

https://www.youtube.com/watch?v=TAe4uZqYt6c

https://hudi.blog/git-submodule/