💡 이번 시간에는 저장소(레포)의 히스토리를 유지하면서 다른 레포로 통합하는 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-one에
move-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-one를 live-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 fetch
로r1remote
저장소의 이력을 가져온다.- 가져온 내용은 r1remote/main 브렌치에 저장된다.
git fetch r1remote
🤔 어? 그런데 어떤 이유로
git pull
이 아니라git fetch
를 하는 걸까?
git fetch
는 내용만 가져오지만,git pull
은 원격 저장소의 내용을 가져와 자동병합까지 한다.- 현재 우리는 move-test-two를 통합 레포(live-history)로 가져와, 병합을 진행할 예정이다.
- 이때, 서로 다른 레포를 병합할 때는 추가적인 옵션이 필요하기에
git fetch
로 진행한 것이다. - 다음 과정을 보면 옵션을 알 수 있다.
- 그 다음으로,
git fetch
로 가져온r1remote/main
를 live-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
였는데, 이동시킬 레포를 불러와서 병합하는 방식이었다.
이처럼 레포의 히스토리를 살리면서 다른 레포로 이동하는 건 흔치 않지만,
모노레포를 도입하거나 자신의 레포를 팀 레포로 옮겨야하는 경우 유용하게 쓸 수 있다!
반응형
'개발 기술 > 개발 이야기' 카테고리의 다른 글
[JS] Strict mode는 무엇일까? (0) | 2022.10.29 |
---|---|
[github Actions] 파일 경로에 따라 라벨링하고 릴리즈하기(feat. 모놀리식 레포) (0) | 2022.10.19 |
이미지 로딩 시간을 줄이는 3가지 방법 (0) | 2022.09.24 |
[CSS] 스타일 우선순위를 정하는, Cascade Layer(@layer) (0) | 2022.09.11 |
[JS] 애니메이션을 만드는 2가지 방법(setInterval, requestAnimationFrame) (0) | 2022.08.06 |
댓글