본문 바로가기

Papyrus/Troubleshooting

svn:externals 속성을 활용하여 외부 위치에서 소스 가져오기

SVN의 잘 알려지지 않은 속성 중 하나는 svn:externals이다. 이 속성은 현재 저장되어 있는 소스 트리의 일부분을 다른 저장소에서 가져오도록 지정하는 속성인데, 이를 활용하면 디스크 공간을 절약하고 소스 관리를 훨씬 효율적으로 할 수 있다. 예를 들어, 다음과 같은 상황에서 이 속성을 활용할 수 있다.

 

project1 --- trunk --- main

                        --- service

                        --- extra

                        --- support --- extlib

 

extlib --- trunk

 

project1의 suppport 밑의 extlib는 project1 개발에 필요한 라이브러리지만, 이 라이브러리는 이미 저장소의 다른 위치에서 관리되고 있다. extlib를 직접 project1에 포함시킬 수 있겠지만, 그렇게되면 project1 개발 도중 extlib에서 일어난 변화는 일일이 extlib에 적용해야 한다.

 

이럴 경우, support 디렉토리에 svn:externals 속성을 적용하여 extlib --- trunk에서 해당 항목을 가져오도록 지정할 수 있다. extlib에 수정이 필요하다면 extlib를 체크아웃하여 필요한 수정을 하고, 다시 project1 디렉토리로 돌아와 업데이트를 해주면 SVN은 즉시 변경 사항을 project1에 반영할 것이다. 한 두개 이상의 프로젝트에 공통적으로 적용되는 소스를 포함해야 할 때, 이 방법은 프로젝트마다 중복된 소스를 단일한 방법으로 관리할 수 있는 최상의 수단이다. 사용 방법은 다음과 같다:

 

support 디렉토리에서,

 

svn propset svn:externals "extlib svn://extlib/trunk" .

 

만약, SVN의 환경 변수에 편집기를 지정했다면 다음의 명령으로 복수의 속성을 동시에 지정할 수 있다:

 

svn propedit svn:externals .

 

이 명령을 입력하면 설정한 편집기에서 extlib svn://extlib/trunk을 입력할 수 있는데, 여러 개의 디렉토리를 지정할 수도 있다. svn://과 같은 시작어는 임의로 정한 것인데, http를 통한 접근이 될 수도 있고, 내장 SVN 서버를 가리킬 수도 있다.

 

단, svn:externals 속성은 현재 속한 저장소의 다른 위치를 가리켜야 한다. 예를 들어, 특정 branches의 트리가 trunk의 어떤 리비전을 복사한 것이라면, branches 가지의 하위 트리에 다시 trunk의 특정 경로에 대해 svn:externals 속성을 지정할 수 없다.