개인 프로젝트 news-summary는 기존에 한 레포지토리 안에서 백엔드 코드와 프론트엔드 코드를 관리하고 있었으나(monorepo) 프로젝트 규모 확장에 따른 빌드 속도 저하를 해결하고, 프론트/백엔드 간의 의존성을 제거하여 프로젝트의 복잡도를 낮추고 유지보수성을 높이기 위해 분리를 결정했다. 처음엔 새로운 리포지터리를 만들면 이전의 히스토리가 사라지게 될까봐 걱정이 있었는데 다행히 clone을 해서 히스토리도 남길 수 있는 방법이 있었다. 아래는 그 순서들을 기록하여 앞으로도 같은 방법을 사용할 때 보다 쉽게 진행할 수 있도록 하였다.
- 원본 리포지터리: news-summary
- 새로 만들 리포지터리: news-summary-frontend
- 분리할 폴더명: frontend
기존 리포지터리에 영향을 주지 않도록 안전한 곳에 임시 작업 폴더를 만든다.
git clone https://github.com/사용자명/news-summary.git news-separation-work
cd news-separation-work
git subtree split 명령어를 사용하여 특정 폴더의 기록만 가진 새로운 임시 브랜치를 만든다.
# --prefix 뒤에는 분리할 폴더명을, -b 뒤에는 임시 브랜치 이름을 적는다.
git subtree split --prefix=frontend -b split-branch
GitHub에서 생성한 새로운 빈 리포지터리 주소를 origin으로 등록(기존 연결을 끊고 새로 등록하는 방식)
# 기존 원격지(원본) 연결 삭제
git remote remove origin
# 새 리포지터리 연결
git remote add origin https://github.com/사용자명/news-summary-frontend.git
추출한 임시 브랜치의 내용을 새 리포지터리의 main 브랜치로 푸시.
# [임시브랜치명]:[새리포지터리의메인브랜치명]
git push origin split-branch:main
이제 새 리포지터리에 접속해 보면, 과거에 frontend 폴더 내의 파일을 수정했던 커밋 로그들이 그대로 살아있는 것을 확인된다. 작업이 끝난 임시 폴더는 삭제해도 무방!
새 리포지터리로 이사가 끝났다면, 원본 리포지터리에서 더 이상 필요 없는 폴더를 삭제해준다.
git checkout main
git rm -r frontend
git commit -m "refactor: extract frontend code into a separate repository"
git push origin main
폴더 분리해서 clone했을때 .gitignore에 있는 파일들은 안 옮겨질 수 있으니 주의할 것!