프롤로그
개발을 하다 보면 자신이 담당한 업무에 대한 오너십이 중요하다는 사실을 알게 되는데요. 이 오너십을 위해서는 자신이 맡은 업무에 관한 관심과 애정 그리고 업무적인 주도성이 필요합니다.
그런데 개발은 대부분의 경우 혼자 하는 것이 아니며 개발자도 사람이다 보니 오너십이 무너지는 상황이 발생하기도 하잖아요? 이를 정책적으로 막기 위해서 저장소별로 권한을 부여하거나 PR은 하나 이상의 리뷰를 꼭 거친 후 Merge를 할 수 있도록 하는 방법 등을 많이들 고려하십니다.
그런데 이런 상황이면 어떻게 오너십을 부여할 수 있을까요?
예를 들어 Monorepo 방식을 사용해 모든 프로젝트가 하나의 저장소에 모여있다면 신규 입사한 개발자는 권한과 관계없이 모든 프로젝트를 확인할 수 있게 됩니다. 코드를 수정하는 것은 저장소 내 규칙을 통해서 제한을 걸 순 있습니다만 관리의 중요도가 높은 프로젝트의 경우 권한 있는 사람을 제외하곤 노출 자체를 막고 싶을 수 있습니다.
이렇게 개발팀의 상황마다 원하는 방식의 관리 방법이 있을 텐데요.
오늘은 어떤 저장소 내에서 다른 저장소의 코드를 불러와 사용할 수 있는 ‘서브모듈’에 대해서 설명해 보려고 합니다.
서브모듈
서브모듈은 Git 저장소 안에 다른 Git 저장소를 추가해 사용할 수 있게 도와줍니다. 추가된 다른 Git 저장소는 커밋도 독립적으로 동작합니다. 각 저장소의 변경 사항도 각자 추적됩니다.
이 서브모듈을 사용하면 전체 프로젝트가 하나의 저장소에 포함되지 않더라도 손쉽게 분할된 저장소를 하나의 저장소로 모아 개발, 관리, 배포할 수 있습니다. 사실 프롤로그에서 거창하게 말한 것 같지만 Git에서 잘 만들어둔 기능 덕분에 ‘서브모듈’의 용도와 유무만 알고 있다면 쉽게 도입할 수 있는 것도 장점입니다.
어떻게 시작하는지 알아볼까요?
시작하기
메인으로 설정한 저장소를 ‘submodule_main’, 서브로 정한 저장소를 ‘submodule_sub’로 이름을 정하겠습니다.
우선 메인 저장소에서 시작해 볼까요?
메인 저장소에서 아래와 같이 서브 저장소를 넣어주세요.
repository-url은 저장소의 경로 path는 서브 저장소를 메인 저장소의 어느 경로에 생성하고 싶은지 git submodule add [repository-url] [path]
성공하셨다면, .gitmodules 파일과 원하는 경로에 서브 저장소의 내용이 저장되는데요.
변경사항을 확인해보시면 서브 저장소의 내용은 추적되지 않고 있는 것을 알 수 있습니다.
.gitmodules 파일은 다음과 같이 생성되는데요.
[submodule "sub"] path = sub url = https://github.com/MoveRoad/submodule_sub.git
이 파일을 통해 메인 저장소와 하위 저장소가 어떻게 매핑되어 있는지를 기록하고 관리합니다.
서브저장소를 더 추가한다면 위와 같은 코드가 여러 개 생기게 됨을 확인할 수 있습니다.
서브모듈마다 변경사항 추적을 따로한다.
만약 메인 저장소에서 여러 서브모듈을 불러와 개발하던 도중에 서브모듈을 수정해야 한다면 어떻게 해야 할까요?
메인 저장소에서는 서브모듈의 변경 사항을 추적하지 않기 때문에 커밋, 푸시를 할 수 없습니다. 그럼 서브모듈의 변경 사항이 생긴 경우, 이를 복사 붙여넣기를 통해 옮겨야 해야겠네요. 조금 귀찮지만 나쁘지 않다고 생각 할 수도 있는데요.
기가막히게도 메인 저장소에서 불러온 서브모듈 마다 변경 사항이 따로 추적됩니다. 메인 저장소에서 불러온 서브모듈의 변경이 생겨도 변경한 서브모듈의 경로에서 커밋, 푸시를 실행한다면 실제 서브 저장소의 Remote에도 반영이 됩니다.
정말 간편하고 좋지 않나요?
다만 한가지 신경 써야 하는 점이 있습니다. 불러온 서브모듈이 항상 최신 상태임을 보장할 순 없기 때문인데요.
git submodule update —remote
위 명령어를 통해 서브모듈을 Remote에 올라간 브랜치를 기반으로 업데이트를 할 수 있습니다.
물론 서브모듈의 경로에서 git fetch, git merge를 통해서도 할 수 있습니다.
권한 없는 저장소는 불러올 수 없다.
정책적으로 저장소를 불러올 수 있는 권한이 없다면 메인 저장소에서 서브 저장소는 서브모듈로 추가 할 수 없어요. 이를 활용해 중요한 패키지나 모듈, 프로젝트 등을 관리해 보세요.
추가정보
한번 서브모듈을 추가한 뒤 .gitmodules가 생긴 뒤로는 메인 저장소를 새로 Clone 하는 경우에 한 번에 서브모듈을 가져올 수 있어요.
원래는 메인 저장소만 Clone 한다면 서브모듈은 텅 빈 폴더만 불러와지는데요. 처음 메인 저장소를 Clone 할 때, 기록된 서브모듈을 포함해서 Clone 하려면 아래와 같이 입력하면 됩니다.
git clone --recurse-submodules [main-repository-url]
마무리
‘서브모듈’을 알기 전에 해당 방식을 어떻게 구현해야 하나 고민이 많았는데 Git에서 이런 부분까지 고려해서 만들어 두었을 줄은 몰랐습니다. 제 생각에는 수요가 많지 않은 방식이지 않을까 했는데 다행히도 수요가 있었기에 기능을 제공하고 있었네요.
기능도 쉽게 사용할 수 있도록 제공해 준 Git에게 오늘도 감사함을 느끼며 마무리하겠습니다.
감사합니다. 😄
Reference.
👉🏻 Git - 서브모듈