때때로 여러 다른 체크아웃으로 구성된 작업 사본을 만드는 것이 유용합니다. 예를 들어, 다른 파일이나 하위 디렉터리가 저장소의 다른 위치에서 오거나 아예 다른 저장소에서 오기를 원할 수 있습니다. 모든 사용자가 동일한 레이아웃을 갖도록 하려면, 필요한 위치에 지정된 리소스를 가져오도록 svn:externals 속성을 정의할 수 있습니다.
/project1의 작업 사본을 D:\dev\project1로 체크아웃했다고 가정해 봅시다. D:\dev\project1 폴더를 선택하고, 마우스 오른쪽 버튼을 클릭한 다음 컨텍스트 메뉴에서 → 을 선택하십시오. 속성 대화 상자가 나타납니다. 그런 다음 Subversion 탭으로 이동하십시오. 거기에서 속성을 설정할 수 있습니다. 을 클릭하십시오. 속성 대화 상자에서 svn:externals가 이미 존재하면 더블 클릭하거나, 버튼을 클릭하고 메뉴에서 externals를 선택하십시오. 새 외부 항목을 추가하려면 를 클릭한 다음 표시되는 대화 상자에 필요한 정보를 입력하십시오.
URL은 제대로 이스케이프되어야 하며, 그렇지 않으면 작동하지 않습니다. 예를 들어, 각 공백을 %20으로 바꾸어야 합니다.
로컬 경로에 공백이나 다른 특수 문자를 포함하려면 큰따옴표로 묶거나, 특수 문자 앞에 Unix 셸 스타일 이스케이프 문자로 \ (백슬래시) 문자를 사용할 수 있습니다. 물론 이는 경로 구분 기호로 / (슬래시)를 사용해야 함을 의미합니다. 이 동작은 Subversion 1.6에서 새로 추가된 것이며 이전 클라이언트에서는 작동하지 않습니다.
위에서 설명한 대로 모든 외부 정의에 명시적 리비전 번호를 사용하는 것을 강력히 고려해야 합니다. 이렇게 하면 외부 정보의 다른 스냅샷을 언제 가져올지, 그리고 정확히 어떤 스냅샷을 가져올지 결정할 수 있습니다. 통제할 수 없는 타사 저장소의 변경 사항에 놀라지 않는 상식적인 측면 외에도, 명시적 리비전 번호를 사용하면 작업 사본을 이전 리비전으로 되돌릴 때 외부 정의도 해당 이전 리비전에 있었던 모습으로 되돌아간다는 것을 의미합니다. 이는 외부 작업 사본이 저장소가 해당 이전 리비전에 있었을 때의 모습과 일치하도록 업데이트됨을 의미합니다. 소프트웨어 프로젝트의 경우, 이는 복잡한 코드베이스의 이전 스냅샷에 대한 빌드가 성공했는지 실패했는지의 차이가 될 수 있습니다.
svn:externals 속성의 편집 대화 상자를 사용하면 외부 항목을 선택하고 명시적으로 HEAD 리비전으로 자동 설정할 수 있습니다.
외부 프로젝트가 동일한 저장소에 있는 경우, 주 프로젝트를 커밋할 때 그곳에서 변경한 모든 내용이 커밋 목록에 포함됩니다.
외부 프로젝트가 다른 저장소에 있는 경우, 외부 프로젝트에 대한 변경 사항은 주 프로젝트를 커밋할 때 표시되거나 표시되지만, 해당 외부 변경 사항은 별도로 커밋해야 합니다.
svn:externals 정의에서 절대 URL을 사용하고 작업 사본을 재배치해야 하는 경우(즉, 저장소의 URL이 변경되는 경우), 외부 항목은 변경되지 않으며 더 이상 작동하지 않을 수 있습니다.
이러한 문제를 피하기 위해 Subversion 클라이언트 버전 1.5 이상은 상대 외부 URL을 지원합니다. 상대 URL을 지정하는 네 가지 방법이 지원됩니다. 다음 예시에서는 두 개의 저장소가 있다고 가정합니다: 하나는 http://example.com/svn/repos-1에 있고 다른 하나는 http://example.com/svn/repos-2에 있습니다. http://example.com/svn/repos-1/project/trunk를 C:\Working으로 체크아웃했으며, svn:externals 속성은 trunk에 설정되어 있습니다.
이러한 URL은 항상 ../ 문자열로 시작합니다. 예를 들어
../../widgets/foo common/foo-widget
이는 http://example.com/svn/repos-1/widgets/foo를 C:\Working\common\foo-widget으로 추출합니다.
URL은 svn:externals 속성이 있는 디렉터리의 URL에 상대적이며, 외부 항목이 디스크에 기록되는 디렉터리에 상대적이지 않습니다.
이러한 URL은 항상 ^/ 문자열로 시작합니다. 예를 들어
^/widgets/foo common/foo-widget
이는 http://example.com/svn/repos-1/widgets/foo를 C:\Working\common\foo-widget으로 추출합니다.
동일한 SVNParentPath(여러 저장소를 포함하는 공통 디렉터리)를 사용하여 다른 저장소를 쉽게 참조할 수 있습니다. 예를 들어
^/../repos-2/hammers/claw common/claw-hammer
이는 http://example.com/svn/repos-2/hammers/claw를 C:\Working\common\claw-hammer으로 추출합니다.
// 문자열로 시작하는 URL은 URL의 스키마 부분만 복사합니다. 이는 네트워크 위치에 따라 동일한 호스트 이름에 다른 스키마로 액세스해야 할 때 유용합니다. 예를 들어, 인트라넷의 클라이언트는 http://를 사용하는 반면, 외부 클라이언트는 svn+ssh://를 사용합니다. 예를 들어
//example.com/svn/repos-1/widgets/foo common/foo-widget
이는 C:\Working을 체크아웃하는 데 사용된 방식에 따라 http://example.com/svn/repos-1/widgets/foo 또는 svn+ssh://example.com/svn/repos-1/widgets/foo를 추출합니다.
/ 문자열로 시작하는 URL은 URL의 스키마와 호스트 이름 부분을 복사합니다. 예를 들어
/svn/repos-1/widgets/foo common/foo-widget
이는 http://example.com/svn/repos-1/widgets/foo를 C:\Working\common\foo-widget으로 추출합니다. 하지만 svn+ssh://another.mirror.net/svn/repos-1/project1/trunk에 있는 다른 서버에서 작업 사본을 체크아웃하는 경우, 외부 참조는 svn+ssh://another.mirror.net/svn/repos-1/widgets/foo를 추출합니다.
필요한 경우 URL에 대한 펙(peg) 리비전과 운용 리비전을 지정할 수도 있습니다. 펙 리비전과 운용 리비전에 대해 더 자세히 알아보려면 Subversion 책의 해당 장 을 읽어보십시오.
위에 있는 예시들처럼 외부 항목의 대상 폴더를 하위 폴더로 지정하는 경우, 중간에 있는 모든 폴더도 버전 관리되는지 확인해야 합니다. 따라서 위 예시에서 common 폴더는 버전 관리되어야 합니다!
중간 폴더가 버전 관리되지 않더라도 대부분의 상황에서 외부 항목은 제대로 작동하지만, 예상대로 작동하지 않는 몇 가지 작업이 있습니다. 그리고 탐색기의 상태 오버레이 아이콘도 올바른 상태를 표시하지 않습니다.
TortoiseSVN이 속성을 처리하는 방법에 대한 추가 정보가 필요하면 “프로젝트 설정” 섹션을 읽어보십시오.
공통 하위 프로젝트에 액세스하는 다양한 방법에 대해 알아보려면 “공통 하위 프로젝트 포함” 섹션을 읽어보십시오.
Subversion 1.6부터는 폴더와 동일한 구문을 사용하여 단일 파일 외부 항목을 작업 사본에 추가할 수 있습니다. 하지만 몇 가지 제한 사항이 있습니다.
파일 외부 항목의 경로는 svn:externals 속성을 설정한 폴더의 직접적인 하위여야 합니다.
파일 외부 항목의 URL은 파일 외부 항목이 삽입될 URL과 동일한 저장소에 있어야 합니다. 저장소 간 파일 외부 항목은 지원되지 않습니다.
파일 외부 항목은 여러 면에서 다른 버전 관리되는 파일과 동일하게 동작하지만, 일반적인 명령을 사용하여 이동하거나 삭제할 수 없습니다. 대신 svn:externals 속성을 수정해야 합니다.
다른 작업 사본에 외부 항목으로 포함하려는 파일이나 폴더의 작업 사본이 이미 있는 경우, Windows 탐색기에서 드래그 앤 드롭을 통해 간단히 추가할 수 있습니다.
파일이나 폴더를 오른쪽으로 드래그하여 한 작업 사본에서 외부 항목으로 포함하려는 위치로 이동하기만 하면 됩니다. 마우스 버튼을 놓으면 컨텍스트 메뉴가 나타납니다: . 해당 컨텍스트 메뉴 항목을 클릭하면 svn:externals 속성이 자동으로 추가됩니다. 그 후에는 속성 변경 사항을 커밋하고 업데이트하여 해당 외부 항목이 작업 사본에 제대로 포함되도록 하기만 하면 됩니다.