⭐️ 목적

백엔드 프로젝트를 새로 시작하면서, 또 다시 AWS EC2를 생성하게 되었다.

 

실수로 노출되면 한 순간 엄청난 과금이 이루어지는 정보들을 또 다시 관리해야했다.

 

서비스 코드 레포는 추후 퍼블릭으로 변경하여 포트폴리오 용도로 사용할 예정이기 때문에 중요한 설정 정보들을 관리해야했다.

 

.env에 환경변수로 관리하거나 .gitignore를 이용해서 yml 파일 자체를 안올리는 방법도 있지만,

두 방법 모두 새로 배포를 할 때마다 수동으로 추가해야 된다는 점에서 굉장히 귀찮다고 생각했다.

 

이러한 이유로 민감한 정보가 포함된 yml 파일들을 저장하는 레포를 따로 만들어서 Submodule로 연결하게 되었다.

 

 

✅ 서브모듈 연결

먼저 서브모듈로 활용할 레포를 생성해준다. (평소 레포 생성하는 것과 똑같이하면 된다)

 

서브모듈을 연결할 메인 레포를 클론한다.

 

로컬 레포 경로에서 다음 명령어를 입력해준다.

git submodule add ${URL} {원하는 디렉토리 명이 있을 경우 명시}

 

URL의 경우 서브모듈로 활용할 레포의 URL을 입력하면 된다.

 

서브모듈이 추가될 경우 서브모듈 매핑 정보가 담긴 .gitmodule이 생성된다. (이게 생성되지 않으면 어떤 일이 일어나는지는 뒤에 정리)

 

서브모듈이 연결될 경우 설정한 이름과 똑같은 디렉토리가 생성된다.

 

다른 레포의 파일들을 원래 디렉토리 경로로 설정 파일 사용하는 것처럼 똑같이 사용할 수 있게 된 것이다.

 

 

✅ 서브모듈 관리

서브모듈은 메인 레포에 포함된 디렉토리처럼 보이지만, 매핑만 된 것이지 여전히 별도의 레포이다.

 

따라서 서브모듈에 변경할 내용이 있거나, 업데이트할 내용이 있다면 따로 관리해주어야 한다.

 

서브모듈 업데이트

처음 레포를 clone한 경우에 서브모듈을 함께 clone하기 위해서 --recurse-submodules 플래그를 추가한다. 

git clone --recurse-submodules {URL}

# 또는

git submodule init
git submodule update

 

위의 과정은 한 번만 진행하면 된다.

 

이후 팀원이든 어떠한 이유로 서브모듈이 변경되었다면, 로컬에서 업데이트 해줘야 한다.

git submodule update --remote

 

서브모듈 커밋

보통 깃허브에 변경 내용을 push 할 때 다음과 같은 과정을 거친다.

git add .
git commit -m "적당한 커밋 메시지"
git push origin "브랜치명"

 

만약 서브모듈의 내용을 변경한 뒤, 본 프로젝트 디렉토리에서 위와 같이 push 하면,

[변경된 본 프로젝트] - [변경되기 전 서브모듈] 와 같은 형태로 push가 된다.

 

반드시 서브모듈 디렉토리에서 먼저 commit > push 후 본 프로젝트 디렉토리에서 push 해야한다.

다음과 같은 흐름이다.

cd "서브모듈 디렉토리"
git add .
git commit -m "서브모듈 적당한 커밋 메시지"
git push origin "서브모듈 브랜치명"

cd ..
git add .
git commit -m "적당한 커밋 메시지"
git push origin "브랜치명"

 

왜냐하면, 서브모듈을 커밋 식별자를 통해 연결하고 있기 때문이다.

 

깃허브의 모든 커밋에는 랜덤 문자열 형태의 식별자가 붙는다.

 

9b88be3라는 커밋 상태에서 변경 내용이 포함된 ae4c2f3이라는 새로운 커밋이 생성된 것을 의미한다.

 

따라서 서브모듈의 내용을 변경하더라도 커밋을 하지 않으면,

본 프로젝트에서는 변경 내용이 적용되지 않은 기존의 커밋과 연결되어 있기 때문에 이전 서브모듈과 연결된 상태로 깃허브에 push가 된다.

 

따라서 서브모듈 내에서도 커밋을 진행해서 변경 내용이 포함된 새로운 커밋을 만들어내고,

본 프로젝트에서 "연결된 커밋(식별자)이 변경된 내용"을 포함한 커밋을 push해야 하는 것이다. (쓰고 나니 읽기가 요상하다)

 

 

✅ 트러블슈팅

앞서 서브모듈을 추가하면 본 프로젝트 디렉토리에 매핑 정보가 적혀있는 .gitmoudules가 추가된다고 했다.

 

하지만 어떤 이유인진 모르겠지만 처음 서브모듈을 추가했을 때 해당 파일이 추가되지 않았고,

로컬에선 돌아갔기 때문에 신나서 push한 나는 팀원이 빈 디렉토리를 클론하는 모습을 지켜봐야했다.

 

왜 빈 디렉토리로 보이는 지 찾아다니다가 깃허브 페이지를 봤는데

 

위와 같이 서브모듈에 커밋 식별자가 포함되지 않아 클릭해도 서브모듈 레포로 넘어가지지 않았다.

 

그제서야 .gitmodules가 없다는 것을 알아차렸고, 매핑 정보가 없기 때문에 빈 깡통이 서브모듈로 연결되고 있는 것을 알게 되었다.

 

처음엔 서브모듈이 추가되지 않은 것인가 싶어서 add를 한번 더 진행했다.

❯ git submodule add {URL}
fatal: '어쩌구-config' already exists in the index

 

이미 추가된 서브모듈이라는 에러만 출력 됐다.

 

어쩔 수 없이 서브모듈을 제거하고자 git rm --cached business-card-config 를 입력했는데,

또 어떤 이유인지 모르겠지만 갑자기 .gitmoudules가 생성되어 제대로 동작되었다.

 

사실 서브모듈 연결을 끊고자 입력한 것이지만, 명령어를 잘못해서 git 인덱스에서 서브모듈을 제외하는 명령어를 입력해버렸다.(이러면 해당 디렉토리가 커밋 내용에서 제외된다)

 

그런데 보이지 않던 .gitmodules가 나타났고, 커밋은 여전히 잘되는 상황이 돼버렸다.

 

일단 사용하고다가 나중에 이유를 알게 된다면 내용을 추가하도록 하겠다.

'개발 메모' 카테고리의 다른 글

ELK stack + Kafka 적용 일지  (0) 2024.08.12

+ Recent posts