예전에 약 4개의 별도 python 프로젝트로 개발되던 git repository 를 하나로 합치는 작업을 진행했었다.
프로젝트를 4개로 나눠서 개발하다가 한 프로젝트 내의 모듈로 구분하여 넣어야 했기에 진행했던 작업이라, 소스코드 수정은 불가피했다.
다행히 개발 초기단계라서 감당할 수 있는 수준이었는데, 만약 좀 더 고도화 된 상태였다면 감당할 수 없었을 것이다.
그래서 어떻게 했는지 간단하게 회고록을 써본다.
merge 되려는 모든 프로젝트는 합병 후 파일이 서로 충돌하지 않도록 서로 구분해두어야 한다.
각 프로젝트는 내부에 폴더 하나를 만들어 그 안에 모든 파일을 이동시켜야 한다.
예를들어, p1, p2, p3 세 프로젝트를 하나로 합치려고 하면,
프로젝트들을 합칠 기준 repo를 선정한다. 혹은 새로 repo 를 만든다. 예시에서는 p1을 기준으로 하겠다.
기준 repo에, 나머지 프로젝트들을 더하고, fetch하고 merge하고 remote를 지우는 작업을 반복한다.
합칠 프로젝트 이름이 각각 p1, p2 라고 한다면,
git remote add p1 git@~~~/p1.git
git fetch p1
git merge --allow-unrelated-histories p1/master
git remote rm p1
git commit
git push
git remote add p2 git@~~~/p2.git
git fetch p1
git merge --allow-unrelated-histories p2/master
git remote rm p2
git commit
git push
여기까지 했다면 p1 내에 2개 프로젝트의 모든 파일과 히스토리가 포함되게 된다.
합쳐진 파일 구성은 다음과 같다
p1
p1/_p1
p1/_p2
이제 각 폴더의 파일 위치는 프로젝트 성격에 맞게 다시 위치시켜주면 된다.
python -m venv venv
source venv/bin/activate
pip install -r project1/requirements.txt
pip install -r project2/requirements.txt
pip freeze > requirements.txt
find . -type f -name '*.py' -exec sed -i 's/from util/from project1/util/g' {} \;
find . -type f -name '*.py' -exec sed -i 's/from common/from project1/common/g' {} \;
find . -type f -name '*.py' -exec sed -i 's/from workspace/from project1/workspace/g' {} \;