rein's world

다른 svn 저장소를 svn 저장소 밑에 링크하기

내가 주로 진행하는 프로그래밍 작업인 G가 있고, 부가적으로 진행했던 작업 A가 있다. 근데 A가 G의 라이브러리 부분을 거의 다 가져다가 쓰지만, G의 소스트리와 공유되기는 좀 힘들었던 점이 있었다. 일단  G의 소스트리는 다음처럼 생겼다.

Externals/
    log4cxx
    boost

Lib/
    Library1
    Library2

Projects
    Project G/
        Libraries under Project G
    (Other projects)/

    (Project A 가 여기에 있어야하겠지만, 사정상 다른 svn에 있음)

A는 Projects에 있는게 적합하긴 하지만, 실제로 같은 트리에 통합되는건 좀 무리라 이 트리에 직접 추가하진 않았다. 그래서 A를 빌드하려면   G를 체크아웃하고, A를 체크아웃해서 A의 디렉토리를 Projects 밑으로 복사하거나 해야 한다. 게다가 경로가 다르면 라이브러리 등의 링크 위치가 꼬여서 수많은 오류 메시지를 봐야…

이런 귀찮은 문제를 해결할 방법은 없을까? svn은 property란 것을 디렉토리에 지정할 수 있는데 이 중에 svn:externals 란게 있다. 이걸 사용하면 특정 디렉토리가 (외부의) 다른 svn 저장소를 가리키게 된다.

예를 들어 WordPress 개발버젼을 하나 체크아웃하고, 플러그인 디렉토리에 내가 개발 중인 플러그인의 svn 저장소를 다음과 같이 연결할 수 있다. ((물론 실제 저장소에는 반영할 권한이 없어서 못하겠지만))

svn propedit svn:externals .

이러면 에디터가 뜨고 거기서 다음과 같이 설정한다. Windows의 tortoiseSVN에서는 GUI 로 편집창을 띄울 수 있다. 여기서는 plugins 디렉토리를 . 으로 지정해서 수정했다. 절대/상대 경로를 . 대신 줘도 마찬가지 효과.

akismet http://plugins.svn.wordpress.org/akismet/trunk/
annual-stats-dev file:///home/rein/repos/annual-stat

각 줄은 링크될 디렉토리 이름과 svn 저장소 주소(protoco://주소 형식)다. 이 경우엔 기존에 이미 akismet 이란 디렉토리에 외부 svn 저장소가 링크되어 있어서, 새로운 항목을 두번째 줄에 추가했다. 그리고나서 svn update 해주면 완료. 위에서 설명한 것도 Projects 디렉토리의 property를 수정해서 링크되게 했다. 이 이후에는 업데이트를 하면 처음으로 체크아웃되며, 그 이후의 업데이트에는 상위 디렉토리에서 업데이트 할 때 링크된 리파지터리까지도 진행된다.

ps. 리비젼 지정(-r revision-number를 디렉토리 뒤에 붙여서) 등의 기능도 넣어서 쓸 수 있다. 회사에서도 현재 잘 쓰고 있는 svn 기능인듯.