흔한 개발자의 일상

Git으로 외부 프로젝트 복사해서 사용하기(subtree) 본문

개발자 공부 로그/Git

Git으로 외부 프로젝트 복사해서 사용하기(subtree)

memory_captain 2020. 2. 14. 19:08

 

좋은 라이브러리를 깃헙에서 가져왔는데 뭔가 오류가 있어서 수정도 하고 싶고
수정된 소스를 다른 프로젝트에 쓰고 싶다면 어떻게 해야 할까?

 

프로젝트를 진행하다 보면 외부 프로젝트를 내 프로젝트에 조합해(incorporating) 사용할 때가 많다.

기본적으로 내 프로젝트에 외부 깃 프로젝트를 복사해서 내 로컬 저장소에 커밋하지 못한다. 어떻게 해야 할까?

대안은 있다. submodule 과 subtree 방식 두가지 중 자신에게 맞는 것을 사용하면 된다.

 

하지만 이것으로 만족하지 못했는지 통째로 가져와 수정하고 싶다면 subtree 방식을 사용해야 한다.

 

서브 모듈과 서브 트리의 차이

 

1. 서브 모듈

  • 서브 모듈은 외부 프로젝트를 자신의 리모트 저장소에서 포인트를 해 매번 클론을 할때 마다 링크된 모듈들도 같이 받아오는 방식이다.
  • 즉, 서브모듈 컴포넌트 기반 개발이며 각각의 모듈들에 의존한다.

 

아래 같이.gitmodule 이란 파일에 모듈들을 다운받을 링크들이 담겨있는 것을 확인 할 수 있다.

 

 

.gitmodule 파일

 

2. 서브 트리

  • 서브 트리 한번에 외부 프로젝트 전체를 저장해 자신의 로컬 저장소에 커밋한다.
  • 즉, 서브트리는 시스템 기반 개발이며 모든 정보를 갖고 있으며 언제든지 어느부분이든 수정할 수 있다.

 

간단한 서브트리 워크플로우

 


 

서브트리 사용 방법

 

이 사이트를 참고하였으니 좀더 디테일하게 참고하고자 하는 분들은 여기서 보시면 된다.

 

 

1. 내 리모트 저장소에 해당 외부 저장소를 가리키기(Point)

$ git add <내 리모트 저장소 이름> <외부 저장소 이름>

e.g:

$ git remote add itext_remote https://github.com/xivSolutions/iTextToolsExample.git

 

 

 

2. 포인트한 외부 저장소 데이터를 내 리모트 저장소로 가져오기

$ git fetch <remote_name>

e.g:

$ git fetch itext_remote

 내 로컬 리모트 저장소가 외부 저장소를 가리키기 때문에 fetch를 하면 가리키고 있는 저장소의 파일을 가져옵니다.

 

 

 

3. 받아온 외부 저장소 데이터의 브랜치와 동시에 내 로컬 저장소 브랜치 생성하기

$ git checkout -b <new_branch_name> remote_name/branch_name

e.g:

$ git checkout –b itext_branch itext_remote/master

내 로컬 리모트 저장소에 새 브런치를 생성하면서 외부 프로젝트 브런치를 복사해 가져옵니다.