본문 바로가기

Papyrus/Troubleshooting

서브버전 저장소 분할 및 병합

서브버전의 저장소를 구성할 때, 가장 고민 되는 부분은 여러 프로젝트를 포함하는 하나의 단일 저장소 형태로 구성할 것인지, 프로젝트마다 각각의 저장소를 구성할지 여부이다. 두 가지 방법은 각각 장단점을 가지고 있어서 저장소 구성 방법을 선택하기 쉽지 않다. 그러나, 서브버전은 저장소를 덤프하고, 덤프된 데이터를 다른 저장소로 로드하는 수단을 제공하며, 이것은 저장소 일부 데이터를 대상으로도 가능하다. 기본적으로 서브버전이 단일 저장소를 권장하는 것은, 내부 프로젝트들의 변경 이력을 더 쉽게 추적할 수 있고, 필요하다면 언제든지 저장소를 분할할 수 있기 때문이다.

 

전체 저장소를 덤프하고 로드하는 것은 익히 잘 알려진대로, svnadmin 명령어를 사용하며, 다음과 같다:

 

svnadmin dump URL > dumpfile

svnadmin load URL < dumpfile

 

저장소 일부를 덤프할 때는 svndumpfilter를 사용하여 필터링 조건을 정해준다. 서브버전은 저장소 내의 프로젝트를 단순히 서브 디렉토리로 구별하기 때문에, 저장소 일부를 덤프한다는 것은 특정 서브 디렉토리에 대해 작업한다는 뜻이다. 저장소 내의 특정 서브 디렉토리만 덤프할 때는 다음과 같다:

 

svnadmin dump REPOSITORY_PATH | svndumpfilter [include|exclude] PROJECT_PATH > dumpfile

 

REPOSITORY_PATH는 저장소의 경로이며, PROJECT_PATH는 저장소 내에 위치한 서브 디렉토리의 경로이다. svndumpfilter의 include 명령을 사용하면 지정한 PROJECT_PATH만 덤프하며, exclude 명령을 사용하면 지정된 경로의 디렉로리만 제외되고 덤프된다.

 

해당 덤프 파일을 다른 저장소의 특정 서브 디렉토리로 로드할 때는 --parent-dir 옵션을 사용하며, 다음과 같다:

 

svnadmin load REPOSITORY_PATH --parent-dir NEW_PROJECT_PATH < dumpfile

 

REPOSITORY_PATH는 저장소의 위치이며, NEW_PROJECT_PATH는 저장소 내의 서브 디렉토리 경로다. 예를 들어, 새로운 저장소 디렉토리 이름이 ./NewRepo라 하고, 덤프 데이터를 저장소의 /Migration/NewProject 디렉토리로 옮기고 싶다면 위의 명령은 다음과 같다:

 

svnadmin load ./NewRepo --parent-dir Migration/NewProject < dumpfile 

 

이 작업을 하기 전에, New 디렉토리와 NewProject 디렉토리는 저장소에 이미 존재하고 있어야 한다. 이 방법을 응용하면, 서브버전 저장소를 분할하거나, 각각의 저장소를 하나의 저장소로 병합할 수 있다.