회사에 입사하여 오리엔테이션을 진행하던 중 ODC Team(Offshore Development Center)의 개발 파일(Git)들을 내부망에 있는 SVN 프로젝트에 안정적으로 반영해야하는 상황이 왔다. 현재 상황은 파일들을 말 그대로 "복사 -> 붙여넣기"하고 있었기에 단순하게 엎어치기 한다면 github respository에 있는 결과물들을 SVN 기존 코드에 맞추어 반영하기엔 어려움이 있어보여 방법을 찾아보았다.
git diff로 생성한 패치(Patch) 파일을 활용하는 방식이 있다는 것을 알게 되었고 이를 통해 외부 Git PR의 변경사항을 내부 SVN 프로젝트에 훨씬 안정적이고 체계적으로 적용할 수 있다는 점을 확인할 수 있었다.
아래에서는 이 방법이 왜 필요한지, 어떤 상황에 효과적인지, 그리고 어떻게 사용하는지를 정리해 보았다.
💡 왜 Patch 방식이 필요한가요?
외부 조직에서 개발한 Git 프로젝트의 특정 기능을 내부망 SVN 프로젝트에 반영할 때 단순 파일 복사로는 다음과 같은 문제가 발생할 수 있다.
- 기존 코드와의 충돌 여부를 사전에 확인할 수 없음
- 히스토리나 변경 내용을 추적하기 어려움
Patch 파일을 활용하면 Git의 변경 이력을 기준으로 필요한 부분만 정확히 적용할 수 있기 때문에 기존 방식보단 훨씬 효율적이고 안정적일 것으로 예상한다 !!!
git clone <외부 Git 저장소 주소>
cd <저장소 디렉토리>
git fetch origin pull/<PR번호>/head:<로컬 PR 브랜치 이름>
# git fetch origin pull/45/head:pr-45
git merge-base master <로컬 PR 브랜치 이름>
위 커밋 ID는 PR이 master에서 갈라져 나온 시점. (=변경 범위 기준점)
git diff <커밋 ID> <로컬 PR 브랜치 이름> > <파일명>.patch
# git diff 4a2f78b pr-45 > pr-45.patch
주의 : Git과 SVN의 디렉토리 구조가 동일해야 패치가 정상 적용된다.
Git 환경에서 작업한 외부 기능을 SVN 기반 내부 시스템에 반영하는 것은 번거롭고 오류가 발생하기 쉽다. Patch 기반 적용 방식을 통해 충돌 최소화, 변경 이력 추적을 할 수 있도록 한다.
형상관리를 외부 개발팀과 다르게 진행(Git/Svn) 해야하는 팀이라면 위 방법을 적용해보도록 하는 것을 추천한다.👻