본문 바로가기

프로그래밍/개발지식

여러 개의 Git Repository를 하나로 합치기 (history 유지)

반응형

배경

평소 책을 보며 프로그래밍 공부를 할 때, 실습을 하기 위해 각 책마다 Git 저장소를 만들었다. GitHub에 공부한 내용을 올려 점심시간에 회사에서 그리고 퇴근 후 집에서 연속적인 실습을 할 수 있었고, 책을 읽으며 했던 내용을 다시 볼 수 있었다.

그런데 매번 새로운 Git 저장소를 만들다 보니 내 GitHub에는 책을 완독한 후 잘 보지 않을 1회용 저장소만 무한정 늘어나고 있었다.
최근에는 이를 해결하고자 "studyspace"라는 저장소 하나에 공부한 내용을 폴더별로 분리해서 관리하기 시작했다. 나중에 Git History가 많아지면 비대한 저장소가 되겠지만, 아직까진 이 방식이 가장 마음에 들었다.

이제부터 본론이다.
하나의 저장소를 사용하면서 "과거에 사용했던 다른 저장소의 데이터(파일, 로그 등)를 하나의 저장소로 통합할 순 없을까?"라는 생각이 들었다.
그래서 이번 포스트에는 과거의 기록을 보존하면서 손쉽게 다른 저장소의 데이터들을 한 저장소로 가져오는 방법을 올리고자 한다.

시나리오

(실제 GitHub 저장소를 가지고 수행한 내용이다.)

과거에 사용했던 저장소 3개가 존재한다.
하나로 합치고 나면 아래의 저장소들은 GitHub에서 제거할 예정이다.

  1. test_driven_development_book (https://github.com/hyunto/test_driven_development_book)
    --> studyspace/tdd/test_driven_development_book 경로에 저장된다.
  2. python_tdd_study (https://github.com/hyunto/python_tdd_study)
    --> studyspace/python/python_tdd_study 경로에 저장된다.
  3. study_note (https://github.com/hyunto/study_note)
    --> studyspace/database 경로에 저장된다.

 

위 저장소를 studyspace(https://github.com/hyunto/studyspace)라는 새로운 저장소로 모두 옮길 예정이다. 물론 그동안 수행했던 Git History도 함께 통합될 것이다.

과정 1. Base 저장소 Clone 하기

$ git clone https://github.com/hyunto/studyspace.git
'studyspace'에 복제합니다...
remote: Enumerating objects: 464, done.
remote: Counting objects: 100% (464/464), done.
remote: Compressing objects: 100% (254/254), done.
remote: Total 1146 (delta 139), reused 415 (delta 102), pack-reused 682
오브젝트를 받는 중: 100% (1146/1146), 403.48 KiB | 759.00 KiB/s, 완료.
델타를 알아내는 중: 100% (487/487), 완료.

$ cd studyspace

과정 2. test_driven_development_book 저장소 합치기

$ mkdir tdd

$ git subtree add --prefix=tdd/test_driven_development_book https://github.com/hyunto/test_driven_development_book.git master
git fetch https://github.com/hyunto/test_driven_development_book.git master
warning: 공통 커밋 없음
remote: Enumerating objects: 152, done.
remote: Total 152 (delta 0), reused 0 (delta 0), pack-reused 152
오브젝트를 받는 중: 100% (152/152), 26.76 KiB | 6.69 MiB/s, 완료.
델타를 알아내는 중: 100% (34/34), 완료.
https://github.com/hyunto/test_driven_development_book URL에서
 * branch            master     -> FETCH_HEAD
Added dir 'tdd/test_driven_development_book'

$ ls -lh tdd
total 0
drwxr-xr-x  6 jhyunto  staff   192B  2  4 23:49 test_driven_development_book

git subtree를 이용하면 다른 저장소의 데이터를 fetch한 후 내가 원하는 경로에 추가해준다.
Sourcetree를 통해 Git History를 확인해보면 기록이 보존된 것을 볼 수 있다.

이제 git subtree로 추가한 저장소를 원격 저장소인 GitHub에 올려보자.

$ git push
오브젝트 나열하는 중: 157, 완료.
오브젝트 개수 세는 중: 100% (157/157), 완료.
Delta compression using up to 4 threads
오브젝트 압축하는 중: 100% (76/76), 완료.
오브젝트 쓰는 중: 100% (155/155), 27.13 KiB | 13.57 MiB/s, 완료.
Total 155 (delta 35), reused 152 (delta 34)
remote: Resolving deltas: 100% (35/35), completed with 1 local object.
To https://github.com/hyunto/studyspace.git
   ecbaca3..79fd53c  master -> master

과정 3. 나머지 저장소도 합쳐보자

###
# 여기서는 상세 출력은 생략한다.
###
$ mkdir python
$ git subtree add --prefix=python/python_tdd_study https://github.com/hyunto/python_tdd_study master
$ git subtree add --prefix=database https://github.com/hyunto/study_note.git master
$ git push
반응형