서브버전은 일반적으로 잠금 없이, 앞에서 설명한 “복사-수정-병합” 방식을 사용하는 것이 가장 잘 작동합니다. “복사-수정-병합 해결책” 섹션에서 자세히 설명합니다. 하지만 어떤 형태의 잠금 정책을 구현해야 하는 몇 가지 경우가 있습니다.
예를 들어 그래픽 파일과 같이 “병합 불가능한” 파일을 사용하고 있습니다. 두 사람이 같은 파일을 변경하면 병합이 불가능하므로, 한 명은 변경 사항을 잃게 됩니다.
귀사는 과거에 항상 잠금 방식의 버전 관리 시스템을 사용해 왔고, “잠금이 최고”라는 경영진의 결정이 있었습니다.
우선 서브버전 서버가 최소 1.2 버전 이상으로 업그레이드되었는지 확인해야 합니다. 이전 버전은 잠금을 전혀 지원하지 않습니다. file:// 접근 방식을 사용한다면, 당연히 클라이언트만 업데이트하면 됩니다.
이 섹션과 이 책의 거의 모든 곳에서 “잠금”이라는 단어는 충돌하는 커밋을 피하기 위해 사용자 간의 상호 배제 메커니즘을 설명합니다. 불행히도 서브버전과 이 책이 때때로 다루어야 하는 다른 두 가지 종류의 “잠금”이 있습니다.
두 번째는 작업 사본 잠금으로, 동일한 작업 복사본에서 작동하는 여러 서브버전 클라이언트 간의 충돌을 방지하기 위해 서브버전이 내부적으로 사용합니다. 일반적으로 업데이트/커밋 등과 같은 명령이 오류로 인해 중단될 때마다 이러한 잠금이 발생합니다. 이러한 잠금은 “정리” 섹션에서 설명한 대로 작업 복사본에서 정리 명령을 실행하여 제거할 수 있습니다.
세 번째로, 파일과 폴더는 다른 프로세스에서 사용 중인 경우 잠길 수 있습니다. 예를 들어 워드 문서를 워드에서 열어두면 해당 파일은 잠겨 TortoiseSVN에서 접근할 수 없습니다.
일반적으로 이러한 다른 종류의 잠금에 대해서는 문제가 발생하여 신경 써야 할 때까지 잊어버려도 됩니다. 이 책에서는 문맥상 반대가 명확하거나 명시적으로 언급되지 않는 한, “잠금”은 첫 번째 종류를 의미합니다.
기본적으로 아무것도 잠겨있지 않으며, 커밋 접근 권한이 있는 사람은 언제든지 어떤 파일이든 변경 사항을 커밋할 수 있습니다. 다른 사용자들은 주기적으로 작업 복사본을 업데이트하고, 저장소의 변경 사항은 로컬 변경 사항과 병합됩니다.
파일에 잠금을 걸면, 해당 파일은 오직 당신만이 커밋할 수 있습니다. 잠금을 해제할 때까지 다른 모든 사용자의 커밋은 차단됩니다. 잠긴 파일은 저장소에서 어떤 방식으로도 수정될 수 없으며, 따라서 잠금 소유자를 제외하고는 삭제되거나 이름이 변경될 수도 없습니다.
잠금은 특정 사용자에게 할당되는 것이 아니라, 특정 사용자와 작업 복사본에 할당됩니다. 한 작업 복사본에 잠금을 가지고 있으면 동일한 사용자가 다른 작업 복사본에서 잠긴 파일을 커밋하는 것을 방지합니다.
예를 들어, 사용자 Jon이 그의 사무실 PC에 작업 복사본을 가지고 있다고 상상해 봅시다. 그는 거기서 이미지 작업을 시작하고, 그 결과 해당 파일에 잠금을 얻습니다. 그가 사무실을 떠날 때, 그는 아직 그 파일 작업을 마치지 않았으므로 그 잠금을 해제하지 않습니다. 집에 돌아와 Jon은 또한 작업 복사본을 가지고 있으며 프로젝트 작업을 좀 더 하기로 결정합니다. 하지만 그는 그 동일한 이미지 파일을 수정하거나 커밋할 수 없습니다. 왜냐하면 해당 파일의 잠금이 사무실에 있는 그의 작업 복사본에 있기 때문입니다.
하지만 다른 사용자들은 당신이 잠금을 걸었다는 사실을 반드시 알지는 못할 것입니다. 그들이 잠금 상태를 정기적으로 확인하지 않는 한, 그들이 잠금에 대해 알게 되는 첫 번째 시점은 커밋이 실패했을 때이며, 이는 대부분의 경우 그리 유용하지 않습니다. 잠금을 더 쉽게 관리할 수 있도록 새로운 서브버전 속성 svn:needs-lock이 있습니다. 이 속성이 파일에 설정되면 (어떤 값이든), 파일이 체크아웃되거나 업데이트될 때마다 해당 작업 복사본이 파일에 대한 잠금을 가지고 있지 않는 한, 로컬 사본은 읽기 전용으로 만들어집니다. 이는 잠금을 먼저 획득하지 않았다면 해당 파일을 편집해서는 안 된다는 경고 역할을 합니다. 버전 관리되고 읽기 전용인 파일은 편집하기 전에 잠금을 획득해야 함을 나타내기 위해 TortoiseSVN에서 특별한 오버레이로 표시됩니다.
잠금은 소유자뿐만 아니라 작업 복사본 위치에 따라 기록됩니다. 여러 개의 작업 복사본(집, 직장)이 있는 경우, 해당 작업 복사본 중 하나에서만 잠금을 유지할 수 있습니다.
동료 중 한 명이 잠금을 획득한 후 해제하지 않고 휴가를 떠나면 어떻게 해야 할까요? 서브버전은 잠금을 강제하는 수단을 제공합니다. 다른 사람이 소유한 잠금을 해제하는 것을 잠금을 깨뜨리기라고 하며, 다른 사람이 이미 소유한 잠금을 강제로 획득하는 것을 잠금을 빼앗기라고 합니다. 당연히 동료들과 좋은 관계를 유지하고 싶다면 이러한 행동을 가볍게 해서는 안 됩니다.
잠금은 저장소에 기록되며, 로컬 작업 복사본에 잠금 토큰이 생성됩니다. 불일치가 있는 경우, 예를 들어 다른 사람이 잠금을 깨뜨렸다면, 로컬 잠금 토큰은 무효화됩니다. 저장소가 항상 최종적인 참조입니다.
잠금을 획득하려는 작업 복사본의 파일을 선택한 다음, → 명령을 선택하십시오.
대화 상자가 나타나서, 당신이 파일을 잠근 이유를 다른 사람들이 볼 수 있도록 주석을 입력할 수 있습니다. 주석은 선택 사항이며 현재 Svnserve 기반 저장소에서만 사용됩니다. 다른 사람으로부터 잠금을 빼앗아야 할 경우 (그리고 오직 그 경우에만), 잠금 빼앗기 상자를 선택한 다음, 을 클릭하십시오.
프로젝트 속성 tsvn:logtemplatelock을 설정하여 사용자가 잠금 메시지로 채울 메시지 템플릿을 제공할 수 있습니다. 속성 설정 방법에 대한 지침은 “프로젝트 설정” 섹션을 참조하십시오.
폴더를 선택한 다음 → 를 사용하면, 잠금 대화 상자가 모든 하위 폴더의 모든 파일이 잠금용으로 선택된 상태로 열립니다. 정말로 전체 계층 구조를 잠그고 싶다면 그렇게 할 수 있지만, 전체 프로젝트에서 동료들을 잠궈버리면 매우 불인기가 될 수 있습니다. 주의해서 사용하십시오...
더 이상 필요 없는 잠금을 해제하는 것을 잊지 않도록, 잠긴 파일은 커밋 대화 상자에 표시되고 기본적으로 선택됩니다. 커밋을 진행하면, 파일이 수정되지 않았더라도 선택된 파일에 대한 당신이 가진 잠금은 제거됩니다. 특정 파일에 대한 잠금을 해제하고 싶지 않다면 (수정되지 않은 경우) 해당 파일의 선택을 해제할 수 있습니다. 수정한 파일에 대한 잠금을 유지하려면, 변경 사항을 커밋하기 전에 잠금 유지 확인란을 활성화해야 합니다.
수동으로 잠금을 해제하려면, 잠금을 해제하려는 작업 복사본의 파일을 선택한 다음, → 명령을 선택하십시오. 더 이상 입력할 것이 없으므로 TortoiseSVN은 저장소에 연락하여 잠금을 해제할 것입니다. 폴더에 대해 이 명령을 사용하여 모든 잠금을 재귀적으로 해제할 수도 있습니다.
당신과 다른 사람들이 어떤 잠금을 가지고 있는지 확인하려면, → 을 사용할 수 있습니다. 로컬에 유지된 잠금 토큰은 즉시 나타납니다. 다른 사람이 가진 잠금을 확인하려면 (그리고 당신의 잠금 중 깨졌거나 빼앗긴 것이 있는지 확인하려면) 을 클릭해야 합니다.
여기 컨텍스트 메뉴에서 잠금을 얻고 해제할 수 있으며, 다른 사람이 가진 잠금을 깨뜨리거나 빼앗을 수도 있습니다.
다른 사람의 잠금을 말하지 않고 깨뜨리거나 빼앗는다면, 작업 손실을 초래할 수 있습니다. 병합 불가능한 파일 형식으로 작업 중이고 다른 사람의 잠금을 빼앗은 경우, 당신이 잠금을 해제하면 그들은 자유롭게 변경 사항을 체크인하고 당신의 것을 덮어쓸 수 있습니다. 서브버전은 데이터를 잃지 않지만, 잠금이 제공했던 팀워크 보호를 잃게 됩니다.
위에서 언급했듯이, 잠금을 사용하는 가장 효과적인 방법은 파일에 svn:needs-lock 속성을 설정하는 것입니다. 속성 설정 방법에 대한 지침은 “프로젝트 설정” 섹션을 참조하십시오. 이 속성이 설정된 파일은 작업 복사본이 잠금을 가지고 있지 않는 한 항상 읽기 전용 플래그가 설정된 상태로 체크아웃되고 업데이트됩니다.
참고로, TortoiseSVN은 이를 나타내기 위해 특별한 오버레이를 사용합니다.
모든 파일이 잠겨야 하는 정책을 운영한다면, 새 파일을 추가할 때마다 속성을 자동으로 설정하는 서브버전의 자동 속성 기능을 사용하는 것이 더 쉽다는 것을 알게 될 것입니다. 자세한 내용은 “자동 속성 설정” 섹션을 읽어보십시오.
서브버전 1.2 이상 버전으로 새 저장소를 생성할 때, 저장소 hooks 디렉토리에 4개의 훅 템플릿이 생성됩니다. 이들은 잠금 획득 전후, 그리고 잠금 해제 전후에 호출됩니다.
잠긴 파일을 이메일로 알려주는 post-lock 및 post-unlock 훅 스크립트를 서버에 설치하는 것이 좋습니다. 이러한 스크립트가 설치되면, 누군가가 파일을 잠그거나 잠금 해제할 경우 모든 사용자에게 알림이 전송될 수 있습니다. 저장소 폴더에서 예제 훅 스크립트 hooks/post-lock.tmpl을 찾을 수 있습니다.
훅을 사용하여 잠금을 깨뜨리거나 빼앗는 것을 허용하지 않거나, 지정된 관리자에게만 제한할 수도 있습니다. 또는 잠금 소유자에게 그들의 잠금이 깨졌거나 빼앗겼을 때 이메일을 보내고 싶을 수도 있습니다.
자세한 내용은 “서버 측 훅 스크립트” 섹션을 읽어보십시오.