개요
프로젝트를 진행하면서 서버 IP와 같은 숨겨야 하는 데이터는
env, local.properties등 git으로 tracking을 하지 않는 파일에 데이터를 넣고 빌드 시에 불러옴으로써,
외부에 노출되지 않도록 관리한다.
다만 여러명이서 프로젝트를 진행하다 보면 서로 개발하다가 필요한 local properties를 넣게 되고,
이를 모른채 그대로 pull 받은 뒤 진행을 하려다 local properties 값을 빠뜨려
Crash가 나는 경험을 겪은 적이 있을 것이다.
각 브랜치마다 필요한 local properties도 다르고, 사람마다 개발에 필요한 것들을 추가하다 보면,
개발시에 여간 걸리적 거리는 것이 아닐 것이다.
이런 경우 어떻게 해야 할까?에 대한 내용을 작성하고자 한다.
Local Properties를 이용한 기존 방식
local properties를 이용한 방법에 대한 설명은 아래 포스팅을 참고해주길 바란다.
Local Properties를 이용하여 민감 정보 숨기기
결론적으로 이와 같은 방식은 Git으로 관리가 되지 않기 때문에 안전하지만 역설적으로 불편했다.
이를 Git의 SubModule을 이용하여 해결을 하고자 한다.
SubModule
Git의 SubModule은 메인으로 관리하는 Project와는 별개로 독립적인 Git 저장소를 포함시킬 수 있는 것이다.
독립적이기 때문에 메인 Project의 Git 버전 관리에도 남지 않는다.
SubModule 적용
SubModule을 위한 Repository 생성
Git Repository를 만드는 구체적인 방법은 생략한다.
단 Private으로 만들어서 외부에서는 볼 수 없도록 해야 한다.
local properties 설정 및 버전 관리
SubModule로 사용할 Repository를 불러오고, local.properties를 만들고 커밋을 올린다.
local properties 설정이름은 원하는대로 설정하면 된다.
본 프로젝트에서는 local.properties라고 설정하였다.
커밋 확인SubModule 세팅
메인 프로젝트에서 명령어를 이용하여 SubModule을 불러온다.
// 메인 프로젝트의 로컬 경로에 서브 모듈의 데이터를 불러오는 명령어 git submodule add <서브모듈-저장소-URL> <로컬-경로>
Git 명령어 실행
메인 프로젝트의 sub라는 폴더가 생기고 그 아래 서브 모듈로 추가한 Repository의 내용이 있다..gitmodules
이렇게 실행해서 서브 모듈을 만든 뒤 git status를 입력하면, 아래와 같이 추가된 것을 잘 볼 수 있다.
sub와 .gitmodules라는 파일이 생긴 것을 볼 수 있다.여기서 .gitmodules는 서브 모듈에 대한 정보를 담은 파일로 아래와 같은 내용이 있는 것을 알 수 있다.
서브 모듈 관련한 내용이 적혀 있는 것을 볼 수 있다.
이렇게 해서 commit을 올리게 되면 아래와 같이 잘 반영이 되어 있는 것을 볼 수 있고,
sub의 경우 Repository가 Private이었기 때문에 눌러도 볼 수 없다.
외부인이 sub 폴더를 클릭을 해도 private repository이기 때문에 내용을 볼 수 없다.
커밋 내역을 통해 엿보려고 해도 이렇게 보이지 않는다.SubModule 초기화
이렇게 SubModule이 설정이 됐다면,
다른 동료들이 Project를 clone 등을 통해 받고나서 초기화를 설정해야 한다.Git Clone 시에는
git clone --recursive <메인-프로젝트-URL>위 명령어로 clone과 동시에 가져올 수 있으며
그게 아니더라도 이미 클론한 Project일 경우
git submodule init git submodule update를 통해서 submodule을 가져올 수 있다.
꼭 clone시 명령어를 입력하지 않더라도 위 명령어로 세팅할 수 있다SubModule Update
프로젝트가 Git Flow 같은 Git Branch 전략을 기반으로 진행된다고 가정했을 때,
Branch마다 필요한 정보가 다를 것이다.그렇다면 각 브랜치별로 SubModule을 만들어서 add를 해야 하는 걸까?
결론은 아니다
앞서 살펴본 .gitmodules에 branch가 명시되어 있지 않다면 HEAD를 가리키는 내용을 가져오고,
명시하면 해당 branch의 내용을 가져오게 된다.SubModule에는 feature/login이라는 브랜치가 있고,
메인 프로젝트의 feature/login 브랜치에서 해당 내용을 가져오고 싶다면아래와 같이 branch를 feature/login으로 세팅을 한 뒤

본 예시에서는 feature/login으로 세팅하였다.
잘 불러와진 것을 볼 수 있다.다만 이러한 방법은 그때 그때 remote에 있는 내용을 불러오는 것이다.
기존의 tracking이 아니라 그때의 commit을 가리키는 것이기 때문에, sub module 폴더로 이동했을 경우 평소와 같이 브랜치를 가리키는 것이 아니라 특정 커밋으로 표시되는 것을 볼 수 있다.
메인 프로젝트는 특정 branch를 가리키지만, submodule은 특정 커밋을 가리키는 것을 볼 수 있다.이러한 이유로 보다 세밀하게 제어를 하고 싶다면, 직접 submodule 폴더로 들어가서 git 명령어로 조작을 하는 방법도 있다.
다만 팀원들과 같이 진행하는 것이기 때문에, gitmodules로도 될 수 있도록 설정하는 것이 좋다