서로 다른 git Repository 를 하나로 합치기

햄스터아저씨·2021년 12월 3일
0

예전에 약 4개의 별도 python 프로젝트로 개발되던 git repository 를 하나로 합치는 작업을 진행했었다.

프로젝트를 4개로 나눠서 개발하다가 한 프로젝트 내의 모듈로 구분하여 넣어야 했기에 진행했던 작업이라, 소스코드 수정은 불가피했다.

다행히 개발 초기단계라서 감당할 수 있는 수준이었는데, 만약 좀 더 고도화 된 상태였다면 감당할 수 없었을 것이다.

그래서 어떻게 했는지 간단하게 회고록을 써본다.

  1. merge 되려는 모든 프로젝트는 합병 후 파일이 서로 충돌하지 않도록 서로 구분해두어야 한다.
    각 프로젝트는 내부에 폴더 하나를 만들어 그 안에 모든 파일을 이동시켜야 한다.
    예를들어, p1, p2, p3 세 프로젝트를 하나로 합치려고 하면,

    1. p1 프로젝트 안에 _p1 폴더 만들고 (임의 명칭)
    2. p1 내 모든 파일을 _p1 으로 이동
    3. 1, 2번 작업을 p2, p3에도 반복한다. 이때 폴더명은 다르게 만들어야 충돌이 나지 않는다. (ex: _p2, _p3)
    4. 커밋 후 push (나의 경우, 프로젝트 별로 repo를 새로 만들어 push했다.)
  2. 프로젝트들을 합칠 기준 repo를 선정한다. 혹은 새로 repo 를 만든다. 예시에서는 p1을 기준으로 하겠다.

  3. 기준 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

이제 각 폴더의 파일 위치는 프로젝트 성격에 맞게 다시 위치시켜주면 된다.


  1. 여기서부턴 python 이라서 했던 추가 작업들이다.
    통합 venv를 설정한다.
python -m venv venv
source venv/bin/activate
  1. pip 종속성 일체화
pip install -r project1/requirements.txt
pip install -r project2/requirements.txt
pip freeze > requirements.txt
  1. 이후 python의 모듈 구조에 맞춰 기존 소스코드들을 수정한다.
    일일이 변경하기 힘드니까 find와 sed 명령사용
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' {} \;
profile
서버도 하고 웹도 하고 시스템이나 인프라나 네트워크나 그냥 다 함.

0개의 댓글