배경
2차 팀 프로젝트를 하면서 외부에 노출되면 안되는 값(DB 주소, 비밀번호, JWT 생성 키 등)들을 관리하기 위해서 Github Environment secrets, Dock .env 파일, Git Submodule 중에서 선택을 하게 되었다
선택을 하게 된 이유로는 아무래도 추가적인 Github Repository에서 관리할 수 있고 Versioning도 되고 여러 파일로 나눠 특징 별로 application-jwt.yml application-db.yml와 같이 파일을 나눠 관리 및 추가와 수정 삭제등이 용이하다는 장점들 때문이다
Submodule 이란
쉽게 말하자면 Git 저장소 안에 Git 저장소를 만들어 넣는 것이다
당연히 .git 폴더가 각각 생기고 개별적으로 Version, Commit 관리도 진행된다
우선 1. 하나의 Git 저장소(어차피 Local에서도 git으로 관리가 되니 원격에 올려도 되고 굳이 안올려도 상관 없다)와 2. 또 다른 하나의 원격 Git 저장소(Github Repository : submodule을 연결 할 때는 원격 저장소의 URL을 사용하기 때문에 꼭 원격에 올려줘야 한다)가 준비되어야 한다
1번은 위 그림에서 바깥 Repository, 2번은 안쪽 Repository이다
Submodule에 있는 값들은 외부에 노출을 시키지 않을 것이기 때문에 Private Repository로 생성해 주면 된다
Submodule 적용
submodule을 추가하고 싶은 Repository 즉 1번 Repository에서 다음 명령어를 추가해 주면 된다
만약 Path를 지정하지 않으면 root 위치에 생성되게 된다
git submodule add [submodule's remote url] [path]
적용을 하게 되면 지정한 Path 밑에 Submodule로 사용하기로 한 Repository의 내용들이 들어가고 추가로 .gitmodules 파일이 생성된 것을 확인 할 수 있다
두개 모두 commit 후 원격으로 push하게 되면 다음과 같이 적용이 된 것을 확인 할 수 있다
Submodule을 포함한 Project Clone
submodule을 같이 clone 받고 싶으면 다음 3개의 명령어를 사용하면 된다
- repository clone
- submodule 정보 기반으로 로컬 환경설정 파일 준비
- submodule 원격 저장소에서 데이터 가져오기
- 단순히 clone만 받으면 submodule project는 detached HEAD 상태이므로 모든 submodule을 main으로 변경해주자
git clone [Repository Url]
git submodule init
git submodule update
git submodule foreach git checkout main
하지만 위 과정은 명령어를 3번이나 쓰고 귀찮기 때문에 clone 시 하나의 옵션만 추가해 주면된다
git clone --recurse-submodules [Repository Url]
git submodule foreach git checkout main
만약 submodule repository 즉 Private Repository가 본인 것이 아니라면 접근 권한이 없어 받아올 수 없을 것이다
이 때는 해당 Private Repository의 주인이 Collaborator로 필요한 인원들을 추가해 주면 된다
이로써 submodule을 이용해 협업 할 준비가 다 되었다
Submodule 파일 수정 내역 업데이트
다음과 같이 Submodule 저장소에 파일을 추가해 뒀고 이제 프로젝트 저장소에서 업데이트 하는 것을 알아볼 것이다
Submodule 디렉토리로 이동해서 git pull통해서 업데이트를 해주면 된다
git diff --submodule을 통해서 업데이트 된 Submodule과 추가된 commit을 확인 할 수 있다
git config —global diff.submodule log 를 이용하면 git diff --submodule 에서 --submodule 옵션을 자동으로 설정해 둘 수 있다
더 간단한 방법으로는 root 디렉토리에서 git submodule update --remote를 사용 하는 것이다
Git이 알아서 Submodule 프로젝트를 fetch와 업데이트를 진행한다
이렇게 업데이트를 하고나서 git status 를 통해 상태를 확인하면 Submodule에 새로운 commit이 생긴 것을 알 수 있다 Commit, push를 통해 원격 저장소에도 적용을 해주자
주의
단순히 git submodule update --remote 만 하면 Submodule 경로로 들어가 확인해보면 branch 가 main이 아닌것을 확인 할 수 있다
git submodule update --remote --merge 를 사용해서 Detached HEAD 상태가 된 branch를 main으로 적용해주자
Main Project 속에서 Submodule Project 수정하기
우선 기본적으로 Submodule Project도 결국 독립된 Git 저장소이기 때문에 일반적인 git 사용법을 가지고 관리가 가능하다
하지만 두 개의 저장소를 관리하기에는 여간 귀찮은게 아니다 Main Project에서도 Submodule Project를 관리를 할 수 있는데 이때 주의할 점이 몇가지 있다
- Main Project에서 Commit 할 때 Submodule Project의 변경 사항이 있는 경우그래야지만 Main Project에서 변경된 Submodule의 Commit을 참조하게 된다
- Submodule Project Commit 후 Main Project 순으로 Commit이 진행되어야한다
- Submodule Project의 Branch를 확인해야 한다이런 경우 예상치 못한 에러가 발생할 수 있으므로 꼭 main branch로 변경 후 수정해야 한다
- 위에서도 봤던것 처럼 단순히 update 만을 하면 Detached HEAD 상태가 되므로 어떤 branch에도 속하지 않은 상태가 된다
수정 방법 - CLI
선 Sub 후 Main 이것만 기억하자
- Main Project 속 Submodule 경로로 이동하여 일반 Repository와 똑같이 진행하면 된다
- Main Project root 경로로 돌아와 수정된 Submodule 참조를 push 해준다
추가
Submodule이 전부 push가 되어있는지 매번 확인하는 것은 어렵고 귀찮은 일이다
아래 두가지 옵션중 하나를 선택해서 Main Project에서 진행을 하면 된다
# 1) Submodule의 Commit 내역이 모두 push 되어있는지 확인하고, 되어있다면 main project push
git push --recurse-submodules=check
# 2) submodule의 Commit 내역을 모두 push하고 성공 시 main project를 push
git push --recurse-submodules=on-demand
둘 중 하나 선택
git config push.recurseSubmodules check
git config push.recurseSubmodules on-demand
수정방법 - Intellij
Intellij내부에서 Submodule Project 경로 내에 있는 application-db.properties 파일을 수정하였고 아래와 같이 2개의 수정 내역이 생겼다
- applicaiton-db.properties : Submodule Project로 전달 될 수정 내역
- prod : Main Project에서 Submodule Project의 참조값 수정 된 내역
위 CLI 편에서 1번과 2번 과정이 각각 똑같이 1, 2번과 동일한 내용이다
각각을 Commit 후 Push를 진행해 주면 된다
요약
- clone
git clone --recurse-submodule [url] [path] # foreach 사용하여 일괄 처리 git submodule foreach git checkout main
- pull/update
git submodule update --remote --merge
- push - submodule 먼저 commit 후 main 진행, Intellij에서 하면 더 편함
git push --recurse-submodules=check # or git push --recurse-submodules=on-demand
- 상태 확인
git submodule status # main에서 git status로 submodule 함께 확인 git config status.submodulesummary 1
- 꼭 Submodule Branch 상태 확인!!!!
Tip
- foreach 사용하여 한번에 모든 submodule 적용
git submodule foreach git stash git submodule foreach git checkout -b featA
- config
# status git config status.submodulesummary 1 # diff git config diff.submodule log #alias git config alias.spush 'push --recurse-submodules=ondemand' git config alias.supdate 'submodule update --remote --merge'
참고
Git - git-submodule Documentation
'공부기록 > 기술공유' 카테고리의 다른 글
RequestBody Runtime시 동적 주입 (0) | 2023.11.15 |
---|---|
??? : 어딜 보시는 거죠 그건 제 잔상입니다만?!? (0) | 2023.11.13 |
Redis 사용기 (2) | 2023.11.12 |
이력서 저장 테이블 구조 재구성 (0) | 2023.11.10 |
Git Branch Linear (0) | 2023.11.06 |