반응형

코드를 관리하면서, 여러 프로젝트에서 동일한 코드를 사용하게 되는 경우가 종종 발생한다. 이러한 상황이 발생하게 될 경우  보통은 코드의 복사/붙여넣기를 통해 코드를 관리하게 된다.

 

이러한 복사/붙여넣기 방식은 코드 관리에 어려움을 겪게 될 수 있는데, 어떤 프로젝트에는 반영된 부분이 다른 프로젝트에는 반영이 되거나 누락되는 경우가 흔히 발생하게 된다.

 

이러한 부분은 git을 사용할 경우 공통된 부분의 코드에 대해 sub module 기능을 이용하여 분리하게 될 경우 편리하게 개선 할 수 있다.

 

sub module이란 파일을 직접 갖는게 아니라 다른 코드 저장소(repository)에 있는 코드를 링크만 하는 방식이다. 이러한 특성을 이용하여 공통된 부분을 폴더로 분리하고 별도의 저장소로 분리한 뒤 해당 모듈을 사용하는 프로젝트에서 간단히 submodule로 추가만 할 경우 공통 부분에 대해 별도의 코드 관리를 거치지 않아도 변경이력을 관리할 수 있으며, 다른 프로젝트에도 손쉽게 적용할 수 있다.

 


 

Sub Module을 사용하기에 앞서, 예제에 사용될 Project의 상황에 대해 다음과 같은 가정을 한다.

 

- Project는 A, B 가 존재하며, 서로 다른 저장소에 저장되어있다.
- Local에서 /code/A, /code/B에 clone하여 사용하고 있는 상태이다.
- Project A, Bhttp://server.git/Ahttp://server.git/B 저장소에 저장되어 있다.
- Project A 및 B에서 module/XmlReader 라는 공통의 폴더를 갖고 있으며, 동시에 사용 중이다.
- Project A, B의 module/XmlReader는 코드가 동일한 상태이다.
- module/XmlReader의 코드를 분리하여 http://server.git/XmlReader 저장소에 저장한다.

 

본문에서는 예제에서 이 XmlReader를 새 저장소로 분리하고, Submodule로 A, B에 추가하는 방법에 대해 작성할 것이다.

 


1. 공통 코드 쪼개기

코드를 쪼개는 순서는 다음과 같이 진행된다.

subtree로 branch 쪼개기 -> branch를 저장소에 push

 

 

공통 코드인 XmlReader를 쪼개기 위해 directory의 코드를 분리하여 local branch에 옮긴다.

cd /code/A
git subtree split -P module/XmlReader -b tmp_XmlReader

위의 명령어의 결과로 A 프로젝트의 module/XmlReader 폴더의 하위에 있는 코드 및 파일들이 branch tmp_XmlReader로 분리된다.


branch로 분리가 되었으면 XmlReader의 저장소를 A프로젝트의 원격 저장소로 추가한다.

git remote add proj_XmlReader http://server.git/XmlReader

위의 명령어의 결과로 A 프로젝트에 XmlReader의 원격 저장소를 proj_XmlReader로 추가된다.

 


이제, Remote 저장소에 XmlReader의 코드들을 push 한다.

git push proj_XmlReader tmp_XmlReader:master

위의 명령어를 통해 XmlReader 저장소의 master 브랜치로 첫번째 단계에서 분리한 branch tmp_XmlReader를 전송하였다.

 

이를 통해 Project A의 코드 중 XmlReader에 대한 코드가 별도의 저장소에 분리가 되었다.

 

 


2. 공통 코드를 Sub module로 처리하기

 

코드를 쪼갰지만, 아직까지는 Project AB에 module/XmlReader에 코드가 그대로 있는 상태다.

이를 개선하기 위해 기존의 파일을 제거하고 Sub module로 처리 한다.

 

먼저, Project AB 에서  파일을 지워준다.

cd /code/A
rm -rf module/XmlReader
cd /code/B
rm -rf module/XmlReader

 

그 다음 각 project에 sub module로 XmlReader를 추가한다.

cd /code/A
git submodule add http://server.git/XmlReader module/XmlReader
cd /code/B
git submodule add http://server.git/XmlReader module/XmlReader

위의 명령어를 통해 A 및 B에 submodule이 생성되었다.

 

마지막으로, submodule 처리에 대한 커밋을 수행한다.

 

cd /code/A
git commit -m 'replaced module/XmlReader with a submodule'
cd /code/B
git commit -m 'replaced module/XmlReader with a submodule'

 

이 과정을 통해 공통 코드를 submodule로 관리할 수 있게 되었다.

 


위의 과정을 통해 Submodule로 분리하였지만,  여러 이유를 통해 Project AB를 clone할 경우 submodule에 대한 코드를 clone하지 않는다.

이는 sub module은 별도의 repository기 때문에 사용자가 직접 init/update를 해줘야 한다.

하지만 명령어에 --recurse-submodules 옵션을 추가하여 자동으로 처리되도록 할 수 있다.

 

git clone --recurse-submodules http://server.git/A

 

 


위와 같은 방법으로 코드를 쪼개고, 별도의 저장소로 분리를 하는 과정은 귀찮을 수 있지만 한번 적용하고 사용하게 될 경우 코드 관리를 함에 있어 신경써야 할 부분이 줄게 되어 편리해 질 수 있다.

 

 

참고자료 : https://coderwall.com/p/a3a5xg/splitting-a-project-sub-directory-to-a-new-git-repo

반응형

댓글을 달아 주세요