Integrate external git repository with its history

프로젝트 a 와 프로젝트 b 를 병렬로 진행하고 있었는데, 두개의 리포지토리를 합치고 싶어지는 경우가 있습니다. 예컨대 프로젝트 a 의 성격이 보다 범용이 되었고 프로젝트 b 는 프로젝트 a 를 위한 도구적 성격이 되는 경우가 있겠죠. a 프로젝트에 ‘b’ 디렉토리를 만들고 그 아래 기존 프로젝트 b 의 파일들을 위치하고 싶습니다. 하지만 기존 b 프로젝트의 git 히스토리들도 유지하고 싶습니다. 비슷한 사례로 리눅스 커널 메모리 모델 프로젝트는 별도의 리포지토리[1] 로 개발되었지만 리눅스 업스트림 리포지토리의 tools/ 디렉토리 아래로 머지[2] 되었는데, 이 때 기존 개발 히스토리를 유지했죠.

이 포스트는 이렇게 특정 git 리포지토리를 그 히스토리를 유지한 채 다른 git 리포지토리의 하위 디렉토리로 옮기는 법을 설명합니다.

[1] https://github.com/aparri/memory-model

[2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/memory-model

초기 상황과 목표

먼저 현재 디렉토리 아래에 a 리포지토리와 b 리포지토리가 있다고 가정합니다:

$ ls
a   b
$

우리는 a 리포지토리 아래 b/ 디렉토리를 만들고 그 아래 b 리포지토리를 넣고 싶습니다.

전략

b 리포지토리가 b/ 디렉토리 아래 모든 파일을 위치하도록 변경한 후, 이 리포지토리를 a 리포지토리에서 --allow-unrelated-histories 옵션을 사용해 머지하도록 하겠습니다.

합쳐질 리포지토리 파일 구조 변경

먼저 b 리포지토리의 파일들이 b/ 디렉토리 아래 위치하도록 만듭니다:

$ cd b
$ mkdir b
$ git mv !(b) b
$ git commit -a -m "Relocate files for inclusion"

리포지토리 병합

이제 b 리포지토리를 임시 remote 리포지토리로 등록하고 머지합니다:

$ cd ../a
$ git remote add temp ../b
$ git fetch temp
$ git merge --allow-unrelated-histories temp/master

--allow-unrelated-histories 는 경로가 다른 파일에 대한 커밋들도 머지가 될 수 있게 해줍니다.

임시로 등록한 remote 리포지토리는 지워줍시다:

$ git remote rm temp

정리

이상과 같이 기존의 개발 히스토리를 유지하면서 특정 git 리포지토리를 다른 git 리포지토리의 하위 디렉토리로 병합하는 방법을 알아보았습니다.

Avatar
SeongJae Park
Kernel Development Engineer

SeongJae Park is a programmer who loves to analyze and develop systems.

Related