내 취미 프로젝트 중 하나에서 git submodule을 사용하고 있었는데 더는 사용하지 않게 되었다. Git submodule 관리에 대한 많은 글이 있지만, 실제로 내가 필요한 시나리오를 설명한 글은 없어서 처음에 설정하는데 조금 애를 먹었던 기억이 있기에 내가 필요했던 이유와 git submodule 관련된 설정을 블로그에 남긴다. 이 글은 git submodule 사용법이라기보다는 내가 사용한 특정한 시나리오의 설명이다. git submodule 사용법 글은 다른 좋은 글들이 많이 있다.
Git submodule 이란?
아래 문서를 참고하면 좋다
내가 Git submodule이 필요했던 이유
물론 여러 가지 사용예가 있겠지만 나의 경우는 오픈소스를 활용해서 사이트를 만들던 중, 해당 오픈소스에서 내가 필요한 부분은 고칠 필요가 있었고, 그러면서도 오픈소스가 업데이트가 되면 정기적으로 내 프로젝트에 반영하고 싶었다. 이 프로젝트는 라이브러리나 플랫폼이라기보다는 완전 제품에 가까운 것이라서 내가 필요한대로 사용하려면 수정을 해서 써야했다. 결국 upstream 관리를 위해 내 프로젝트 안에 원래 오픈소스 프로젝트를 git 서브모듈로 가지고 있는 것이 가장 좋다는 결론을 내렸다. 아래는 내가 사용한 방법:
오픈소스 이름을 github.com/developer/openproject 라고 하고 내 프로젝트를 github.com/tebica/myproject 라고 하자.
- github.com/developer/openproject 를 포크 해서 github.com/tebica/openproject 를 만든다.
- github.com/tebica/openproject 에서 master에서 branch를 따서 for_myproject 브랜치를 만들고 거기에 필요한 수정을 한다.
- github.com/tebica/myproject 안에 submodule 로 github.com/tebica/openproject 의 for_myproject 브랜치 를 추가한다.
(방법은 위에 문서들을 참고) - Submodule 이 저장된 디렉토리 안에서 remote 로 원래 오픈소스 저장소인 github.com/developer/openproject 를 upstream 으로 추가한다.
Myprojec 의 .gitmodules (자동생성) 에는 아래와 같이 되어있다.
submodule “openproject_tebica"] path = openproject_tebica url = https://github.com/tebica/openproject.git branch = for_myproject
Submodule 에서 원래 오픈소스의 master 브랜치의 수정사항을 받아오기 위해서는
- myproject 안의 submodule이 저장된 디렉토리로 이동
- git checkout master
- git pull upstream master // 내 프로젝트에서 수정사항은 for_myproject 브랜치에만 있기 때문에 pull 해도 conflict 나지 않는다.
- git checkout for_myproject
- git rebase master
참고, 프로젝트 로컬 개발환경을 위해 Clone 할때 submodule 까지 clone 해야 한다 recursive 옵션을 사용한다.
git clone --recursive https://github.com/tebica/myproject.git
이제는 git submodule을 안 쓰는 이유
- submodule을 자주쓰는 기능이 아니다보니 쓸데마다 따로 공부하면서 조심조심 써야해서 문제가 될 소지가 있다.
물론 이건 익숙해지면 된다고는 하지만.. 나처럼 취미 코더에게는 득보다 실이 많았다. - 코드 관리 cost가 높아지고 디버깅이 힘들다.
- 원래 오픈소스가 모듈화가 잘 되어있는 플랫폼이라기보다는 특정 기능을 구현한 제품에 가꿔었다. 그러다 보니 내가 원하는 방향으로 가기 위해서는 점점 오픈소스 활용도가 낮아졌다.
- 원래 오픈소스 프로젝트가 거의 죽어서 upstream 관리할 필요가 없어졌다.