사내 프로젝트는 오래전부터 SVN(Subversion) 으로 소스코드를 관리하고 있었다.
하지만 대부분의 개발 조직이 Git 기반 협업 환경(GitHub / GitLab 등) 을 사용하고 있기 때문에, 기존 SVN 저장소를 사내 Git 서버로 백업 및 이관하는 작업을 진행하게 되었다.
이번 글에서는 실제 프로젝트를 이관하면서 진행했던 과정과 그 과정에서 겪었던 트러블슈팅까지 함께 정리해보려고 한다.
1. 목표
이번 작업의 목적은 단순히 소스를 옮기는 것이 아니라 아래와 같은 조건을 만족해야 했다.
- 기존 SVN 저장소는 그대로 유지
- Git으로 전체 소스 백업
- SVN Commit History 유지
- 사내 GitHub 서버(Gitea)로 Push
즉 구조는 다음과 같다.
SVN (기존 운영)
↓
Git 로컬 변환
↓
사내 GitHub 백업
2. 준비 환경
| OS | Windows |
| Tool | Git |
| 작업 경로 | D:\svn_migration |
| SVN 저장소 | https://test.com/project |
| Git 서버 | 사내 GitHub |
먼저 Git에 SVN 명령어가 포함되어 있는지 확인한다.
git svn --version
3. SVN 구조 확인
SVN → Git에서 가장 중요한 단계는 바로 SVN 저장소 구조 확인이다.
svn list https://test.com/project
실행 결과(EX)
WebContent/
classes/
doc/
즉 SVN 구조가 다음과 같이 되어 있었다.
SVN
└ project
├ WebContent
├ classes
└ doc
여기서 중요한 점은 SVN 표준 구조(trunk / branches / tags)가 아니라는 것이다.
이 구조가 없기 때문에 git svn clone 명령어를 사용할 때 옵션을 다르게 줘야 한다.
4. SVN → Git 변환
작업 폴더 생성
D:\svn_migration
다음 명령어 실행(생성한 경로에서 실행이 필요)
git svn clone https://test.com/project --trunk=. project
옵션 설명
| git svn clone | SVN 저장소를 Git으로 변환 |
| --trunk=. | 현재 루트를 trunk로 인식 |
| homepage | 로컬 폴더 |
실행하면 다음과 같이 SVN revision이 Git commit으로 변환된다.
r1 = a3f4e13213
r2 = b4c5d61241
r3 = 7a812442c0
...
5. 변환 완료 확인
변환이 완료되면 Git 로그를 확인한다.
cd project
git log
정상이라면 다음과 같이 SVN commit history가 Git commit으로 변환된 것을 확인할 수 있다.
commit a12345
Author: kim
게시판 수정
commit b23456
Author: lee
로그인 기능 추가
6. Git 서버 연결
GitHub에 Repository를 생성한 뒤 remote를 연결한다.
git remote add origin http://ip:port/github/project.git
연결 확인
git remote -v
7. GitHub Push
메인 브랜치 설정 후 push
git branch -M main
git push -u origin main
8. 트러블슈팅
1. trunk 관련 오류
처음에는 다음 명령어를 사용했다.
git svn clone https://test.com/project --stdlayout project
하지만 다음과 같은 오류가 발생했다.
fatal: refs/remotes/origin/trunk: not a valid SHA1
원인은 SVN 저장소에 trunk 구조가 없기 때문이었다.
아래와 같은 명령어로 해결
git svn clone https://test/homepage --trunk=. homepage
2. Git commit이 없는 문제
clone 이후 다음 오류 발생
fatal: your current branch 'master' does not have any commits yet
이 역시 SVN 구조를 잘못 인식해서 clone이 정상적으로 완료되지 않은 것이었다.
SVN 구조 확인 후 --trunk=. 옵션으로 해결..
3. Git Push 인증 오류
Git push 시 다음 오류 발생
fatal: Authentication failed
원인
- Git 서버 인증 문제
해결
- Git 계정 인증 (아이디 방식 사용)
git remote set-url origin http://아이디@ip:port/github/project.git
ex) git remote set-url origin http://test@127.0.0.1:1000/github/project.git
9. 최종 결과
최종적으로 다음 구조로 이관이 완료되었다.
SVN (기존 유지)
│
└── Git Migration
│
└── GitHub 백업
