프로젝트를 진행할 때 보안상 문제로 Git에 올리지 못하는 데이터가 있다.
대표적으로 DB 인스턴스의 정보를 저장하는 .yml 파일이 있다. 서브모듈을 활용하면 민감 정보를 더 편리하게 관리할 수 있다.
📂 Submodule
Git 레포지토리 하위에 다른 저장소를 관리하기 위한 도구
Git 저장소 안에 다른 Git 저장소를 디렉터리로 분리해 넣는 것이 서브모듈이다.
다른 독립된 Git 저장소를 Clone 해서 내 Git 저장소 안에 포함할 수 있으며 각 저장소의 커밋은 독립적으로 관리한다.
이때 상위 레포지토리를 상위 레포지토리를 부모 저장소, 슈퍼 프로젝트(superproject), 하위 레포지토리를 자식 저장소, 서브 모듈(submodule)이라고 부른다.
✨ 주의할 점
부모-자식 관계라고 부모가 자식을 관리할 수 있다고 생각하면 안 된다. 해당 관계를 연결만 됐을 뿐 값의 변경과 감지는 안된다.
따라서 서브모듈의 내용을 수정할 때엔 해당 서브모듈 레포지토리에서 변경해야 한다.
✔️ 적용하기
1) superproject가 될 레포지토리 생성
프로젝트를 진행할 레포지토리를 생성한다.
2) private 레포지토리 생성
민감 파일을 관리할 레포지토리를 생성한다.
나는 현재 팀원들과 프로젝트를 진행하고 있어 Organization을 만들어 private 레포를 만들었다.
이때 노출되면 안 되는 데이터를 업로드할 것이니 반드시!! private으로 만들어야 한다.
3) .yml 파일 추가
private 레포에 프로젝트에 필요한 .yml 파일을 추가한다.
4) Submodule 추가
다시 1번에서 생성한 부모 레포로 돌아온다.
그리고 서브모듈을 추가해 보자.
$ git submodule add {서브모듈로 등록할 저장소 URL}
위 명령을 입력하면 root 경로에 서브모듈 레포와 같은 이름의 빈 디렉터리가 생성된다.
Git은 해당 디렉터리의 내부 파일을 추적하지 않는다.
또한 서브모듈 프로젝트의 URL 매핑 정보를 담은 설정파일이 생성된다.
- .gitmodules
5) 서브모듈 파일 가져오기
위의 결과로 빈 폴더가 생성되었다. 이럼 이제 프로젝트에서 사용하기 위해서 서브모듈에서 데이터를 가져와보자!
$ git submodule init // 메인 프로젝트 현재 커밋 스냅샷
$ git submodule update --remote // 현재 스냅샷에서 커밋 정보 가져오기
오! 드디어 파일이 생성되었다.
그리고 이것을 이제 원하는 경로로 복사해 주자.
6) 빌드 시 서브모듈 복사
나는 현재 멀티 모듈 프로젝트를 진행하고 있다.
그래서 각각 모듈에 yml 파일을 복사해야 한다.
빌드 시점에 서브모듈을 복사해 오기 위해 build.grade에 다음 코드를 추가해야 한다.
✨ 주의할 점 : 이 경로는 나의 프로젝트에 맞춰진 것이기 때문에 적용하는 프로젝트마다 적절하게 설정해주어야 한다.
- from: submodule 폴더 지정 (위에서 받아온 yml 파일이 있는 폴더)
- include: 포함할 파일
- into: 파일을 복사해서 넣을 경로
task copyPrivate(type: Copy) {
copy {
from '../13th-1team-backend-private'
include "application-domain.yml"
into 'src/main/resources'
}
}
이때 .yml 파일은 public 저장소에는 업로드하면 안 되기 때문에!! 꼭 해당 파일을 .gitignore에 추가해 두자!!!
실컷 세팅 다 해놓고 올리면 눈물 나자녀~
✅ 부모 레포지토리를 클론 할 때 서브모듈 한 번에 가져오기!
클론 시점에 한 번에 서브모듈을 가져오기 위해서 아래 명령어를 사용할 수 있다!
이렇게 클론 하면 submodule init update 하는 과정을 생략할 수 있다.
$ git clone --recurse-submodules {저장소 URL}
✔️ Submodule 변경되었을 때
만약 서브모듈의 프로젝트에 변경이 있을 때는 (.yml 파일 수정) 아래 명령어로 업데이트해 주면 된다.
$ git submodule update --remote --merge
// .gitmodules 파일에 정의되어 있는 브랜치(default는 main 또는 master)의 최신 버전으로 업데이트
$ git submodule update --remote
// 로컬에서 작업 중인 부분과 원격에 작업된 부분이 다른 경우 머지까지 진행
$ git submodule update --remote --merge
노드 마을에서 넘어온 토끼는... 아직도 배울 것이 많다~
📌 Reference
'프로젝트 개발 기록 > Git' 카테고리의 다른 글
[Git] 개발 생산성 향상을 위한 Git Hooks 활용 (with. Spotless) 🎣 (0) | 2023.05.21 |
---|---|
[Git] 한 repository 여러 프로젝트 월세주기 🏡 (0) | 2023.04.24 |
댓글