Git

서로 다른 Git Repository를 Git Log 유지하며 합치기(Feat. git subtree)

Github에 프로젝트를 올리다보면, 끝없이 늘어나는 레포지토리 숫자를 감당할 수가 없어진다. 태그를 달아서 관리하더라도 당장 레포지토리의 개수가 많아지니 점점 찾기 어려워진다. 이런 경우에 같은 주제의 레포들을 하나의 레포로 모으면 편리해진다.

단순히 깃 레포 안에 있는 내용을 복사해서 붙여넣는 방법은 간단하지만, 깃헙을 쓴 가장 큰 이유인 깃 로그나 히스토리가 사라진다. 과연 이걸 유지하면서 하나로 합칠려면 어떻게 해야할까?

C https://github.com/progresshans/c.git
Python https://github.com/progresshans/python.git
Ruby https://github.com/progresshans/ruby.git

예를 들어, 위와 같은 형태의 레포들이 있다면, Programming이라는 하나의 레포로 합치고 싶어진다.

Programming https://github.com/progresshans/programming.git

그리고 구조는 아래처럼 프로그래밍이라는 레포 하위 디렉토리로 각각의 레포를 넣고, Git 로그나 히스토리를 유지하며 넣고 싶다.


Git Subtree를 사용하기!

Git subtree를 사용하면 아주 간편하게 저장소의 다른 레포를 clone해와서 merge까지 해준다! 아래와 같은 식으로 사용을 하면 된다.

git subtree add --prefix="하위 디렉토리 명" "가져올 저장소" "브랜치 지정"

Programming 레포에서 C 레포를 가져와 합치는 방법은 아래와 같다.

# 베이스가 되는 Programming 레포 클론
$ git clone https://github.com/progresshans/programming.git
Cloning into 'programming'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), done.

$ cd Programming/

# subtree를 이용해 C 레포를 Programming 레포에 병합
$ git subtree add --prefix=c https://github.com/progresshans/c.git master
git fetch https://github.com/progresshans/c.git master
warning: no common commits
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), done.
From https://github.com/progresshans/c
 * branch            master       -> FETCH_HEAD
Added dir 'c'

나머지 Python과 Ruby 레포도 위의 과정을 반복하면 된다!