거의 알고리즘 일기장

기존 프로젝트를 git history를 유지한 상태로 monorepo에 프로젝트 합치기 (git history 유지한채로 repo 두개 합치기) 본문

web

기존 프로젝트를 git history를 유지한 상태로 monorepo에 프로젝트 합치기 (git history 유지한채로 repo 두개 합치기)

건우권 2023. 8. 29. 23:51

최근에 회사에서 따로 관리하던 프로젝트 repo를 monorepo에 넣기로 결정이 되어 해당 작업을 맡아 하게 되었다.

그래서 오늘 작성할 주제는

monorepo 마이그레이션 중 git history 유지를 하는 방법이다.

디렉토리 구조는 turbo repo의 구조로 가정한다.


상황 및 조건

monorepo repo, proj-b repo 따로 따로 있다고 가정한다.

1. 현재 이러한 구조의  monorepo 가 있다.

1번

2. proj-b를 monorepo에 추가하고 싶다. (app directory 안에)

2번

3. git history는 유지된 상태여야 한다.


계획

1. proj-b 를 그대로 monorepo에 merge를 때리면 root에 있는 설정파일과 겹치기 때문에 conflict 난다.

2. proj-b 의 파일구조를 변경 (여기서는 app/proj-b 폴더를 만들어서 이곳에 모두 옮기고 commit을 한다.)

2번의 예를 들면 이렇다.

3. monorepo로 가서 local에 있는 proj-b를 git remote로 추가한다.

4. 추가한 remote의 작업한 branch를 merge 한다. 

5. clean up 한다.


작업흐름

위의 계획에 따라 작업하면 명령어 흐름은 다음과 같다.

// 처음은 proj-b 루트, branch naming은 prepare-monorepo로 가정
mkdir proj-b
// proj-b 루트로 다시 가서
git mv -k ^proj-b proj-b (proj-b를 제외하고 proj-b로 전부 옮겨주는거임)
mkdir app
git mv -k ^app app (app을 제외하고 app으로 전부 옮겨주는거임)
git add. 
git commit 

// 3. 모노레포로 이동해서 proj-b를 git remote로 추가
git remote add -f proj-b [proj-b의 상대위치]

// 4. 추가한 remote의 작업한 branch를 현재 브랜치에 merge 한다. 
git merge proj-b/prepare-monorepo -allow-unrelated-histories

// 5. 이후 클린 작업들, 설정 필요없는거 삭제 등등

// 위에 적힌 --allow-unrelated-histories 옵션은 Git에서 git merge나 git pull 명령을 실행할 때, 
두 개의 브랜치나 두 개의 저장소가 서로 관련 없는(commit되지 않은) 이력을 가지고 있을 때, 
이를 병합하거나 통합할 수 있도록 허용하는 옵션이다

  1. 합치기 전에 최대한 proj-b(병합하고 싶은 레포)를 monorepo(base가 되는 레포)와 sync를 맞춰라
    e.g. package manager
  2. monorepo로 넣게 되면 필요없는 세팅들도 미리 삭제해놓는게 편하다.
  3. 위의 작성해놓은 작업흐름은 참고로만 사용하는게 좋다. (명령어는 상황에 따라 다를수 있다.)

하고 나서 생각해보면 별로 어렵지 않은 작업이었는데, 해본적이 없어서 

git history를 어떻게 유지하면서 병합하지?

한참 고민했다ㅠ 

반응형
Comments