개발 기술/개발 이야기

[Git] 저장소를 다른 저장소로 통합하는 2가지 방법(git history 유지)

by GicoMomg (Lux) 2022. 10. 3.

💡 이번 시간에는 저장소(레포)의 히스토리를 유지하면서 다른 레포로 통합하는 2가지 방법을 알아보았다!


1. 사전 준비하기

  • 각각 3개의 커밋을 가진 레파지토리(move-test-one, move-test-two)가 있다.


  • 이 두 레파지토리의 히스토리를 살리면서 live-history(통합 레포)로 옮길 예정이다.


  • mono-test-one를 옮길 때는 “git mirror 방식”을,
    mono-test-two를 옮길 때는 “git remote 방식”으로 진행한다.





2. 레파지토리를 이동하는 2가지 방법(git history 유지)

1) mirror로 이동시키기

(1) mirror란?

  • --mirror를 사용하면 저장소(repo, 레포)의 소스와 커밋 히스토리까지 복사할 수 있다.
  • 커밋 히스토리도 복사하기에, 이동 후에도 코드의 과거 작업을 추적할 수 있다!

(2) git mirror로 mono-test-one 이동시키기

mono-test-one의 커밋 히스토리를 살리면서 live-history-repo로 이동시켜보자!


  • 먼저, move-test-one에서 --mirror를 사용해 move-test-one을 복사한다.
git clone --mirror {통합_레포_URL}


  • 그러면 move-test-onemove-test-one.git폴더가 생성된다.


  • move-test-one.git로 이동한 다음, push 원격 주소를 이동할 레포(live-history)의 주소로 변경한다.
cd move-test-one.git

git remote set-url --push origin 이동할_레포_URL


💡 왜 move-test-one.git에서 push 원격 주소를 변경할까? 기존 원격 상태와 어떤 차이가 있을까?

  • 그 차이는… git remote -v를 해보면 된다!
  • 먼저 move-test-one의 root 폴더에서 git remote -v를 해보자!

  • fetch, push하는 원격 주소가 move-test-one으로 지정되어 있다.
  • 이 말은 git 명령어 사용시 move-test-one을 기본 원격으로 한다는 말이다.

  • 그럼 move-test-one.git 폴더에서는 remote가 무엇으로 설정되어 있을까?
  • 결과를 보면, push 원격 주소가 통합 레포(live-history)로 지정되어 있다!

이렇게 root와 .git의 remote 상태가 다르면,
필요에 따라 커밋을 기존 레포(move-test-one) 혹은 통합 레포(live-history)에 푸시할 수도 있다!


  • 마지막으로 push 명령어로 move-test-onelive-history로 이동시키면, 끝이다!
git push --mirror


  • live-history 레포를 가면, 첫 번째 레포의 커밋 히스토리까지 복사된 걸 확인할 수 있다 😉



2) remote add로 이동하기

(1) remote add란?

  • remote add는 로컬 git 저장소에 원격 저장소를 추가하는 명령어이다.
  • 해당 명령어를 이용하여 추가로 원격 저장소를 만들 수 있다.
  • 여러 개의 원격 저장소를 만들면, 특정 커밋을 필요에 따라 다른 저장소로 push하기 쉽다.
git remote add 리모트명 추가할_원격저장소_URL

(2) remote add로 mono-test-two 이동시키기

mono-test-two의 커밋 히스토리를 살리면서 live-history-repo로 이동시켜보자!


  • live-history에서 r1remote 리모트를 mono-test-two로 지정한다.
git remote add r1remote 가져올_레포의_url


  • git fetchr1remote 저장소의 이력을 가져온다.
  • 가져온 내용은 r1remote/main 브렌치에 저장된다.
git fetch r1remote


🤔 어? 그런데 어떤 이유로 git pull이 아니라 git fetch를 하는 걸까?

  • git fetch는 내용만 가져오지만,git pull은 원격 저장소의 내용을 가져와 자동병합까지 한다.
  • 현재 우리는 move-test-two를 통합 레포(live-history)로 가져와, 병합을 진행할 예정이다.
  • 이때, 서로 다른 레포를 병합할 때는 추가적인 옵션이 필요하기에 git fetch로 진행한 것이다.
  • 다음 과정을 보면 옵션을 알 수 있다.

  • 그 다음으로, git fetch로 가져온 r1remote/mainlive-history에 병합한다.
  • 이때, 앞서 설명했듯이 서로 다른 레포를 병합할 땐 옵션이 필요하다고 했는데, 그게 바로 --allow-unrelated-histories이다.
  • --allow-unrelated-histories를 추가하여 서로 다른 레포의 병합을 허용해준다.
git merge r1remote/main --allow-unrelated-histories

  • 병합 충돌이 있다면 해결한 후, git push를 한다.
git push 

  • 마지막으로 추가했던 r1remote저장소를 삭제하면 끝이다~ 😎
git remote rm r1remote

  • live-history 레포를 가면, 두 번째 레포의 소스는 물론 커밋 히스토리까지 복사된 걸 확인할 수 있다 😃




🙂 이번 시간에는 A, B 레포를 C레포(통합레포)로 이동하는 2가지 방법에 대해 알아보았다!
첫 번째는 mirror를 이용하는 방법으로, 특정 폴더의 push 원격 주소를 바꾸는 방식이었다.
두번째로 소개한 방법은 remote add였는데, 이동시킬 레포를 불러와서 병합하는 방식이었다.

이처럼 레포의 히스토리를 살리면서 다른 레포로 이동하는 건 흔치 않지만,
모노레포를 도입하거나 자신의 레포를 팀 레포로 옮겨야하는 경우 유용하게 쓸 수 있다!

반응형

댓글