본문 바로가기
기타/Git

SVN 히스토리까지 보존하며 Git으로 이관하기

by 방배킹 2026. 2. 22.

회사에서 담당하고 있는 프로젝트 중 하나는 SVN + WAR 수동 배포 구조를 사용하고 있다.
올해 개인 목표 중 하나는 이 프로젝트를 GitLab으로 이관하고, Jenkins를 활용한 CI/CD 환경까지 구축하는 것이다.
단순히 형상관리만 바꾸는 것이 아니라, 배포 방식까지 함께 개선해보려고 한다.
현재 그 과정을 하나씩 진행 중이고, 오늘은 그 첫 단계인 SVN → Git 이관 작업에 대해 정리해보려고 한다.
 

Windows 환경에서 시도 → 인증 실패

처음에는 Windows Git Bash에서 바로 git svn clone을 시도했다.

gitsvn clonesvn://{프로젝트 주소}

svn: E170013: Unable to connect to a repository
svn: E210007: 인증 방법 협상 불가능

왜 이런 오류가 발생했을까?

SVN은 svn:// 프로토콜을 사용할 경우 SASL 기반 인증 방식을 통해 서버와 인증 방식을 협상한다.
SVN 서버가 요구하는 인증 방식 ↔ 클라이언트가 지원(또는 로딩) 가능한 인증 방식
이 둘이 서로 맞아야 정상적으로 접속이 가능하다.
하지만 Windows Git에 포함된 SVN 라이브러리는 해당 인증 플러그인을 지원하지 않거나 로딩에 실패하면서
인증 협상 실패(E210007) 오류가 발생했다.
같은 주소를 WSL에서 실행했을 때는 정상적으로 realm이 표시되었고, 결론적으로 클라이언트 환경 차이 문제라고 판단했다.

WSL에서 재시도

하지만 회사 노트북은 외부망 연결이 차단되어 있어 다음 명령어가 실행되지 않았다.

sudo apt update
sudo apt install-ygit subversion git-svn

외부 노트북에서 패키지 다운로드

외부망이 가능한 개인 노트북에서 해당 패키지를 다운로드만 수행한 뒤 회사 PC로 옮기기로 했다.
여기서 사용한 옵션이 바로 --download-only이다.

--download-only 옵션이란?

sudo apt-get install subversion git-svn

일반 설치의 경우 1. 패키지 다운로드, 2. 다운로드한 패키지 설치, 3. 시스템에 적용 이 된다.

sudo apt-get-y--download-only install subversion git-svn

하지만 --download-only 옵션을 사용하면

  1. 패키지 다운로드, 2. 패키지를 설치하지 않음, 3. .deb 파일만 저장

다운로드된 .deb 파일은 다음 경로에 저장된다. /var/cache/apt/archives/

deb 파일 압축 후 회사 PC로 이동

외부 노트북에서 .deb 파일을 모아 압축한다.

mkdir-p ~/deb_bundle_out
cp /var/cache/apt/archives/*.deb ~/deb_bundle_out/
cd ~/deb_bundle_out
tar czf deb_bundle_git_svn.tgz *.deb

회사 PC에서 설치

회사 PC의 WSL에서 압축을 풀고 설치를 진행한다.

tar xzf deb_bundle_git_svn.tgz
dpkg-i *.deb
# 설치 확인
svn--version
gitsvn--version

SVN 사용자 목록 추출

SVN 커밋 작성자를 Git 사용자 정보로 매핑하기 위해 먼저 SVN 사용자 목록을 추출한다.

svn logsvn://{프로젝트 주소}--quiet \\
|awk-F'|''/^r/ {gsub(/ /,"",$2); print $2}' \\
|sort-u > authors.txt

authors.txt 작성

생성된 authors.txt 파일에는 svn 사용자 목록이 저장되어 있는데, 다음 형식으로 작성해야 한다.

svn아이디 = 이름 <이메일>
# 예시
svnuser1 = gituser1 <gituser1@example.com>
svnuser2 = gituser2 <gituser2@example.com>
svnuser3 = gituser3 <gituser3@example.com>
svnuser4 = gituser4 <gituser4@example.com>

이 파일을 통해 SVN 작성자를 Git 작성자로 정확히 매핑할 수 있다.

SVN 히스토리를 Git으로 이관

이제 --authors-file 옵션을 포함해 git svn clone을 실행한다.

gitsvn clonesvn://{프로젝트 주소} \\
--no-metadata \\
--authors-file=/mnt/c/ingyu/project/authors.txt \\
  {프로젝트 디렉토리}
  • --authors-file : SVN 사용자 → Git 사용자 매핑
  • --no-metadata : git-svn 추적 메타정보 제거 (완전 이관 시 권장)

이 과정을 통해 SVN의 커밋 히스토리와 작성자 정보까지 정상적으로 Git 저장소로 옮길 수 있다.

remotes/git-svn 브랜치란?

git svn clone을 실행하면 바로 master 브랜치에 커밋이 쌓이지 않는 경우가 있다.
대신 다음과 같은 브랜치가 생성된다. remotes/git-svn
이 브랜치는 SVN의 히스토리를 그대로 가져온 원본 추적 브랜치이다.
해당 브랜치를 이용해서 master 브랜치에 MR를 넣으면 완료된다.
 

svn 커밋 로그
git 커밋 로그
gitlab 커밋 목록

 
성공적으로 SVN → Git 마이그레이션을 완료했다.
솔직히 말하면, SVN 이력을 버리고 소스 코드만 옮겼다면 훨씬 빨리 끝났겠지만,,,
기존 커밋 히스토리까지 그대로 가져오고 싶었다. 다른 업무들까지 겹치다 보니 일정이 조금 밀려버렸다. 왜 이렇게 할 게 많은지,,,
히스토리까지 포함해서 깔끔하게 옮겼다는 점에서 매우 만족스럽다.
 
다음에는 Git 기반 환경에서 local / dev / prod 환경별 resources 설정을 분리하고, Jenkins로 CI/CD 파이프라인까지 구축해볼 예정이다!

댓글