본문 바로가기

Computer/Windows

서브버전(Subversion) 사용법

서브버전(Subversion) 사용법을 다루기 이전에 핵심 용어나 개념을 이해하는 것이 필요하다. 본 포스팅에서는 사용법은 명령행 도구(CLI, Command Line Interface)와 윈도우용 TortoiseSVN을 기준으로 설명하고자 한다.

 
 

* 저장소(Repository)


버전 관리되는(version controlled) 모든 파일의 정보(과거 기록 포함)를 가지고 있는 데이터베이스로 서브버전 서버가 동작하는 파일 서버에 위치한다. 한곳에 모든 정보가 집중되는 방식으로 서브버전과 마찬가지로 CVS 또한 중앙집중식의 저장소를 가지고 클라이언트/서버 방식으로 버전을 관리한다. 반면에 최근에는 저장소를 한곳에 집중하지않고 분산시킨(Distributed) 형상 관리 도구들을 사용하기도 하는데 대표적인 것이 Mercurial(http://mercurial.selenic.com/)과 Git(http://git-scm.com/)다.
 

* 작업 사본(Working Copy)


샌드박스라고도 하는데, 개발자가 저장소로부터 최신 버전 또는 특정 버전을 내려 받아 나름의 편집이나 작업을 다른 사람에게 방해를 받거나 반대로 아무런 영향을 미치지 않고 수행할 수 있는 공간이다. 작업을 하다가 삭제, 변경하는 것이 원본 저장소에 아무런 영향을 미치지 않으며 스스로 작업한 내용과 저장소 내용을 손쉽게 비교해서 얼마나 어떻게 작업했는지 간편하게 확인할 수 있다. 작업을 완료한 다음 수정 내용을 원본에 반영할 수 도 있고, 작업 중에 다른 이가 작업한 내용을 현재 작업중인 내용에 손상이 없도록 반영할 수도 있다.
 

* 저장소 생성하기와 저장소 URL

저장소 생성은 "svnadmin create --fs-type fsfs 폴더명"으로 수행할 수 도 있고 
아래의 그림처럼 TortoiseSVN 팝업 메뉴 > Create repository here를 통해서도 저장소를 생성할 수 있다. 단, 저장소 생성 이전에 빈 디렉토리를 만들고 해당 디렉토리의 팝업 메뉴로 저장소를 생성한다.
 
사용자 삽입 이미지
 

팝업 메뉴를 이용하면 아래 그림과 같이 편리하게 trunk, branches, tags 기본 폴더를 생성할 수도 있다.
 
사용자 삽입 이미지
 

위와 같이 생성한 저장소는 로컬 컴퓨터에서는 "file:///D:/tmp/testsvn"과 같은 URL로 접근 할수 있고, 서브버전 서버 프로그램을 설치하면 TCP 3690 포트를 통해서 원격에서도 "svn://192.168.0.111/testsvn"과 같은 URL로 접근할 수 있다. 또한, WebDAV(Web Distributed Authoring and Versioning) 모듈을 웹서버(아파치)에 설치하면 웹 인터페이스를 통해서도 저장소에 접근할 수 있다. 이 때는 "http://192.168.0.111/testsvn"이나 "https://192.168.0.111/testsvn"와 같은 URL로 저장소에 접근할 수 있다. URL 끝에 @리비전번호를 붙이면 특정 리비전을 지정할 수 있다.
 

* 들여오기(Import)와 내보내기(Export)


기존에 형상 관리 대상이 아니었거나 다른 프로젝트에 있던 파일들을 현재 버전으로 들여오거나 현재의 작업 사본(Working Copy)을 일반 파일로 내보내는 명령이다.
 
들여오기는 "svn import -m 로그메시지 들여올경로 서브버전URL" 명령으로 수행하거나 저장소 생성때 처럼 일반 파일 폴더의 팝업 메뉴에서 TortoiseSVN>Import로 들여오기 할 수 있다. 우측 마우스로 클릭한 폴더를 아래의 그림과 같은 Import URL로 들여오면서 지정한 메시지를 남긴다.
 
사용자 삽입 이미지
 
위의 그림을 보면 D:\sorc\nmodbus라는 폴더를 "file:///D:/tmp/testsvn" URL로 지정한 저장소에 들여오기하는 것으로 URL 우측의 [...] 버튼을 클릭하면 아래의 그림과 같은 Repository Browser로 들여오기할 폴더를 구체적으로 지정할 수 있다.
 
사용자 삽입 이미지
 
내보내기는 들여오기와는 반대로 형상관리중인 작업 사본(Working Copy - 저장소 내용과 개별적으로 작업한 내용이 함께 있음)을 버전관리 시스템과는 무관한 일반 파일로 내보내는 기능으로 "svn export 서브버전URL 내보내기경로"명령이나 버전 관리 대상 폴더의 팝업 메뉴>TortoiseSVN>Export로 내보낼 수 있다. 
 
사용자 삽입 이미지
 
내보내기가 작업 사본을 대상으로 하므로 폴더에는 개발자가 나름 생성하고 아직 형상 관리에 포함시키지 않은 파일들이 있을 수도 있는데 그런 파일을 포함시킬지 여부를 "Export unversioned files too" 체크 박스를 통해서 선택할 수 있다.
 
 

* 작업 사본 받기와(Checking out) 업데이트(Update)

본격적으로 코드 작성이나 문서 수정 등의 작업을 하려면 저장소에서 작업 사본을 받아야 한다. "svn checkout 서브버전URL 내려받을경로" 명령으로 작업 사본을 받을 수도 있고, 탐색기 팝업 메뉴>SVN Checkout으로 아래의 그림과 같이 서브버전 URL과 내려받을 폴더를 지정하여 받을 수 있다.
 
사용자 삽입 이미지
 

최신 버전을 받으려면 "Revision" 영역에서 HEAD 리비전을 선택하면 되고 과거의 특정 리비전을 지정할 수도 있는데, 특정 리비전 선택은 명령어 옵션에서는 "-r 리비전 번호" 형태로 지정한다. 일단 작업 사본이 받아지면 해당 내용들은 원본 저장소 기준으로 변경 여부가 관리되고 윈도우 탐색기에서는 아이콘으로 변경 여부를 판단 할 수도 있다. 아래의 그림을 보면 변경 사항이 없는 것은 녹색의 체크 아이콘으로 변경 사항이 있는 것은 적색의 느낌표 아이콘, 버전 관리 대상이 아닌 파일들은 청색의 물음표로 표시한다.
 
사용자 삽입 이미지
 

작업 사본을 받아 작업중인 도중에도 저장소 내용은 다른 사람에 의하여 수정될 수 있다. 이런 경우 내려받았던 작업 사본의 내용에도 영향을 미치게 되는데 이런 문제로 인한 혼란을 방지하기 위해서 자주 서브버전 업데이트 작업을 수행할 필요가 있다.
 
서브버전 업데이트는 최신 상태의 저장소와 현재 작업 사본의 리비전을 비교하여 저장소 기준으로 작업 사본 내용을 갱신하는 작업이다. "svn update"로 현재 경로를 업데이트 하거나 "svn update 작업 경로"로 지정 경로를 업데이트 할 수 있다. 윈도우에서는 작업사본 폴더의 팝업 메뉴>SVN Update를 선택하면 된다.
 
문제는 업데이트 과정에서 작업중인 파일이 저장소에서도 수정되어 충돌이 발생하는 경우이다. 충돌이 발생한 것은 주황색 느낌표로 아이콘을 표시한다. 충돌의 해결은 작업 사본의 작업 내용을 취소(Revert)하는 방법과 작업사본의 작업 내용을 보존하면서 저장소의 내용을 반영하는 방법(Resolved)이 있다.
  • 파일 충돌(File Conflict) : 저장소와 작업 사본이 동일한 파일을 수정하더라도 서로 다른 라인을 수정하면 저장소 내용을 작업 사본에 반영(Merge)하는 방식으로 정상적으로 업데이트되지만 동일한 라인을 수정한 경우에는 무엇을 최종으로 삼아야 할지 프로그램 입장에서는 알 수 없으므로 업데이트 프로그램은 해당 파일에 아래의 형식과 같이 마킹을 포함하여 작업 사본과 저장소의 내용을 모두 담아 작업자가 직접 판단할 수 있도록 한다(코드 내용속에 직접 들어가므로 이상태로 컴파일하면 당연히 오류가 발생한다. 반드시 수정해야 한다). 또한 작업중 파일을 *.mine으로, 업데이트 이전 리비전 기준의 저장소 파일을 *.rNNN로, 업데이트 이후 저장소 파일을 *.rNNN으로 따로 저장해주어 충돌 해소를 위한 자료로 제공한다.
    <<<<<<< 파일명
        작업 사본 내용
    =======
        저장소 내용
    >>>>>>> 리비전 번호
  • 충돌을 해소시킨 다음에는 "svn resolved 충돌경로" 명령이나 탐색기의 충돌 경로 팝업 메뉴>TortoiseSVN>Resolved를 해준다. 단, 이 작업은 자동으로 문제를 해소시켜주는 것이 아니라 충돌시 자동 생성된 *.mine과 *.rNNN파일을 삭제해주는 것이므로 반드시 수작업으로 충돌 부분을 수정해야만 한다.

    한가지 주의할 점은 프로그램 소스 코드나 기타 텍스트 파일들은 원본에 마킹을 하면서 *.mine과 업데이트 전후 리비전 *.rNNN파일 총 3개의 파일을 자동 생성하지만 *.exe, *.dll, *.doc, *.ppt등의 바이너리 파일은 어떤 부분이 수정되었는지 표시할 수 없는 바이너리 파일로 원본 파일에의 마킹도 없고 *.mine도 생성하지 않는다. 바이너리 파일은 파일의 한군데만 수정되어도 충돌이 발생되므로 *.obj같은 임시적 성격의 바이너리 파일들은 버전 관리에서 제외하는 것도 방법이지만 *.doc, *.ppt, *.xls 같은  문서 파일들을 버전 관리하다가 충돌이 발생하면, 즉 누군가가 먼저 수정한 파일을 업데이트 하지 않은 상태에서 수정하고 있다가 충돌이 발생하면 내용을 반영(Merged)할 방법이 없고 어떤 파일을 최종 파일로 선택할지만 남기 때문에 바이너리 문서에 수정한 내용이 많은 경우에는 직접 리비전간 차이를 찾아서 적절하게 반영해야 한다. 바이너리 파일의 충돌에 대해서 Resolved 처리하면 작업사본을 기준으로 계속 작업하겠다는 것이고, 충돌 경로 팝업 메뉴>TortoiseSVN>Revert 또는 "svn revert 충돌경로" 명령을 수행하면 작업 사본의 수정 내용을 취소하고 저장소의 최종 내용을 반영할 수 있다.(Revert 처리도 충돌로 인한 임시 파일들을 삭제한다)
  • 속성 충돌(Property Conflict) : 많이 발생하지 않는 사례이긴 하지만 파일의 내용이 아닌 서브버전이 관리하는 속성 정보에서 충돌이 발생한 경우이다. 아래의 그림은 서브버전에서 설정하는 속성의 예제로 탐색기 팝업 메뉴>TortoiseSVN>Properties에서 설정하거나 "svn propset 속성 속성값 대상경로" 명령으로 설정할 수 있다.
    사용자 삽입 이미지

    속성의 경우에도 파일 내용 중에 동일한 라인으로 수정 내용이 겹치지만 않으면 충돌없이 반영되는(Merged) 것처럼 동일한 속성이 아니면 업데이트 시점에 충돌없이 속성이 반영된다. 그렇지만 동일 속성에 대해 수정인 상태에서 저장소의 내용을 업데이트 하면 속성 충돌이 발생한다. 속성 충돌이 발생하면 *.prej라는 파일에 아래와 같은 형태로 어떤 충돌이 있는지 안내해준다.
    <<<<<<< (local property value)
    Id Revision
    =======
    Author Id
    >>>>>>> (incoming property value)
    충돌을 해소하는 방법은 저장소 속성과 작업 사본의 속성을 비교하여 충돌 파일의 팝업 메뉴>TortoiseSVN>Edit Conflicts에서 [Resolve using local property]로 작업 사본 내용을 기준으로 충돌을 해소하거나 직접 수정해서 해소할 수 있다.
    사용자 삽입 이미지
    충돌 해소이후에는 파일 충돌처럼 
    Resolved 처리를 꼭 수행한다.(속성 충돌을 Resolved 처리하면 *.prej 파일을 자동 삭제한다.
  • 트리 충돌(Tree Conflict) : 누군가 파일이나 폴더를 이동 또는 이름변경 및 삭제 해서 저장소에 커밋했는데 다른 쪽 작업 사본에서 동일한 파일 및 폴더를 수정하고 있거나 이동 또는 이름변경 및 삭제한 상태에서 서브버전 업데이트를 수행하면 업데이트 프로그램은 어느 쪽이 최종 작업인지 알지못하는 트리 충돌이 발생한다. 트리 충돌이 발생하면 파일 충돌이나 속성 충돌 때와는 다르게 임시 파일을 생성하지 않고 경우의 수도  다양하므로 신중한 판단과 작업이 필요하다. 윈도우에서는 충돌 파일의 팝업 메뉴>TortoiseSVN>Edit Conflicts를 수행하면 아래의 그림과 같이 트리충돌 해소를 쉽게 할 수 있도록 기능을 제공하고 있다.
    사용자 삽입 이미지
    위의 예제에서 Resolved 처리는 [Keep the local file]을 클릭하는 것으로 일단 저장소 내용 처럼 파일 삭제 처리후 작업 사본의 작업중 파일을 추가한 상태가 되고, Revert 처리는 작업 사본의 내용을 무시하고 저장소 처럼 파일을 삭제하는 [Remove the file]과 동일하다.

 
 

* 작업 완료하기(Commit)

버전 관리 기반으로 작업하려면 저장소에서 최종 코드를(HEAD 리비전) 내려받아 작업 사본을 준비하고 작업 사본에 대한 수정 작업을 진행하면서 저장소의 최신 내용을 자주 업데이트 해야 한다고 앞서 언급했는데 자주 업데이트 할 수록 충돌을 미연에 방지하거나 충돌로 인한 오버헤드를 최소화 시킬 수 있다.

 
작업 사본에 있는 파일을 수정하는 작업과 달리 새로운 파일 생성하거나 삭제 및 이동하는 작업은 일반 파일의 생성과 삭제 및 이동과 차이가 있다. 예를 들어 작업 사본에 있는 파일 하나를 삭제해도 실제 버전 관리에는 영향이 없다. 서브버전 업데이트를 수행하면 삭제된 파일을 저장소에서 다시 가져오기 때문이다. 파일 이름을 변경하는 경우도 마찬가지이다. 작업 사본에 있는 파일 이름을 변경한 상태에서 서브버전 업데이트를 수행하면 버전 관리 입장에서는 관리 대상 파일이 하나 없어진 것으로만 인식하기 때문에 이름이 변경된 파일에 관계없이 원래 파일을 저장소로부터 새로 가져온다. 파일 생성도 마찬가지로 작업 사본 폴더에 새로운 파일을 생성해도 버전 관리에서는 아무런 관리도 하지 않고 저장소를 통해서 다른 이와 공유할 수도 없다.
 
버전 관리 대상으로의 추가는 "svn add 신규경로" 명령이나 탐색기의 신규폴더 또는 파일의 팝업 메뉴>TortoiseSVN>Add로 수행할 수 있다. 아래 그림은 특정 폴더를 추가한 경우로 하위 폴더까지 자동 추가되는데 "Enable Auto-Properties"를 체크하면 바이너리 파일등 특정 파일 형태에 대하여 자동으로 속성을 설정해 준다. 한가지 주의할 점은 폴더 단위로 추가하면서 버전 관리에 불필요한 임시 파일등이 포함되지 않도록 추가 대상 리스트를 점검해보아야 한다. 
 
사용자 삽입 이미지
 

위의 버전 관리 대상 추가 화면의 "Enable Auto-Properties"는 추가하려는 폴더에 자동 속성 설정 기능을 부여할것인지를 묻는 것으로 *.c, *.java, *.txt 같은 텍스트 파일 형태의 소스 코드나 문서에 작업 완료 시점에 자동으로 작성자, 최종수정일, 리비전등의 정보를 삽입할 수 있도록 하는 것이다. 자동 속성 설정 기능을 사용하기 위해서는 우선 환경 설정이 필요한데 서브버전의 설정 파일은 리눅스등의 경우에는 ~/.subversion/config 또는 /etc/subversion/config를 수정하면 되고 윈도우의 경우에는 %APPDATA%\Subversion\config를 수정하거나 탐색기 팝업메뉴>TortoiseSVN>Settings창에서 General>Subversion 영역에 있는 Subversion configuration file 옆에 있는 [Edit]버튼을 클릭해서 설정 파일을 수정할 수 있다.
 
사용자 삽입 이미지
 
설정 파일을 수정한 다음 저장해야 적용되므로 저장에 주의하고 수정할 내용은 아래의 예와 같이 [auto-props] 섹션에 파일 종류별로 어떤 속성을 자동 설정할 것인지를 지정하는 것과 enable-auto-props = yes로 설정하는 것이다. 설정 파일 각 라인 별로 맨앞에 #이 붙은 줄은 주석이므로 enable-auto-props = yes 앞의 #을 지워야 자동 속성 설정이 가동된다.
 

enable-auto-props = yes
### Set interactive-conflicts to 'no' to disable interactive
### conflict resolution prompting.  It defaults to 'yes'.
# interactive-conflicts = no
### Set memory-cache-size to define the size of the memory cache
### used by the client when accessing a FSFS repository via
### ra_local (the file:// scheme). The value represents the number
### of MB used by the cache.
# memory-cache-size = 16

### Section for configuring automatic properties.
[auto-props]
### The format of the entries is:
###   file-name-pattern = propname[=value][;propname[=value]...]
### The file-name-pattern can contain wildcards (such as '*' and
### '?').  All entries which match (case-insensitively) will be
### applied to the file.  Note that auto-props functionality
### must be enabled, which is typically done by setting the
### 'enable-auto-props' option.
# *.c = svn:eol-style=native
# *.cpp = svn:eol-style=native
# *.h = svn:keywords=Author Date Id Rev URL;svn:eol-style=native
# *.dsp = svn:eol-style=CRLF
# *.dsw = svn:eol-style=CRLF
# *.sh = svn:eol-style=native;svn:executable
# *.txt = svn:eol-style=native;svn:keywords=Author Date Id Rev URL;
# *.png = svn:mime-type=image/png
# *.jpg = svn:mime-type=image/jpeg
# Makefile = svn:eol-style=native
*.txt=svn:keywords=Author Date Revision HeadURL

 
위의 설정 파일에서  *.txt 확장자를 가진 파일들에 대해서 작성자, 수정일시, 리비전, URL 정보를 입력하라는 설정이다. 서브버전 설정이 준비되었으면 다음으로 필요한 것은 개별 파일에 대한 템플릿 작성과 서브버전 속성 설정 작업이다.


통상 소스 코드에 주석문의 형태로 템플릿을 작성해 두면 관련 정보가 삽입되더라도 코드에 영향이 없으므로 상당히 유용한 방법이다. 아래는 단순 텍스트 파일의 앞부분에 삽입한 템플릿 예제로 키워드가 일치하는 곳에 해당하는 최신 정보가 삽입된다.
 

/*
$Author: $
$Date: $
$Revision: $
$HeadURL: $
*/


  
코드에 템플릿이 준비되어 있다면 끝으로 서브버전 속성을 설정하면 자동 속성 설정을 위한 준비는 모두 끝난다. 속성 설정은 탐색기 팝업 메뉴>TortoiseSVN>Properties에서 설정하거나 "svn propset 속성 속성값 대상경로" 명령으로 설정할 수 있다. 속성은 New>Keyword로 추가할 수 있는데 에제에서는  Author, Date, Revision, URL를 선택하여 서브버전 환경 설정에서 *.txt의 자동속성 설정을 위한 속성들과 일치시켰다.
 

사용자 삽입 이미지

 
서브버전 환경 설정, 개별 파일의 템플릿 준비 및 속성 설정까지 끝낸 상태에서 커밋(작업 완료, Commit)처리하면 파일은 아래와 같은 형태로 템플릿이 작성되어 저장소에 보내어 진다.
 

/*
$Author: futuretech $
$Date: 2013-07-03 17:25:22 +0900 (수, 03 7 2013) $
$Revision: 19 $
$HeadURL: file:///D:/tmp/testsvn/trunk/test1.txt $
*/

 
 
 
버전 관리 대상에 추가하면 윈도우에서는 청색 + 아이콘으로 표시하고, 수정한 것은 적색의 느낌표 아이콘으로 표시하지만 삭제한 경우는 실제 작업 사본에서도 삭제하기 때문에 파일 탐색기에서는 삭제 여부를 인지하기 어렵다. 작업 사본에서 삭제하는 방법은 "svn delete 삭제경로"명령이나 삭제 폴더나 파일의 팝업 메뉴>TortoiseSVN>Delete를 수행하면 된다. 단, 작업 사본에는 추가했지만 아직 저장소에 저장하기 이전인 파일들은 "svn revert 파일명" 명령이나 팝업 메뉴>TortoiseSVN>Undo Add로 처리한다.
 
서브 버전 삭제를 비롯해서 작업 사본에 대한 작업 상황을 파악하는 방법은 "svn status" 또는 "svn status 경로" 명령이나 탐색기 팝업 메뉴>TortoiseSVN>Check for modifications을 통해서 아래와 같이 확인할 수 있다. 
 

사용자 삽입 이미지

  
Check for modifications는 작업 사본의 작업 내용 뿐만아니라 [Check repository]버튼으로 저장소에서의 변경 내역 즉, 체크아웃이나 업데이트 이후 타인의 변경이 있었으나 아직 작업 사본에 반영하지 않은 항목들도 확인할 수 있어서 업데이트 내용과 반영 규모에 따라 이후 실제 업데이트 여부를 결정할 수 있다. 또한 리스팅 항목을 클릭하고 팝업 메뉴>Compare with base를 선택하면 작업사본과 저장소의 "Working Base"(작업사본이 변경된 경우) 또는 작업 사본과 저장소의 remote file간의(저장소가 변경된 경우) 비교를 아래와 같이 확인할 수 있다.
 

사용자 삽입 이미지

  

 
파일 및 폴더의 복사와 이동은 윈도우에서는 두가지 방법으로 수행할 수 있다. 첫번째 방법은 우측 마우스 Drag & Drop으로, 이동 및 복사할 대상을 우측 마우스로 드래그(Drag)하여 목적지에 드롭(Drop)하면 아래와 같은 메뉴가 나오는데 이때 "SVN Move..." 또는 "SVN Copy..."을 선택하여 이동 및 복사하는 방법이다. 이 때 주의할 점은 평소에 많이 사용하는 왼쪽 마우스 Drag & Drop이 아니라 탐색기에서 우측 마우스 Drag & Drop을 사용해야 하는 것과 목적지가 반드시 버전 관리 대상 폴더여야 한다는 것이다. 버전 관리 대상이 아닌 폴더를 목적지로 하면 "SVN..." 메뉴가 나오지 않는다.
 

사용자 삽입 이미지


 
두번째 방법은 탐색기에서 이동 및 복사할 대상을 팝업메뉴로 복사 또는 잘라내기하고 버전 관리 대상인 폴더의 팝업 메뉴>TortoiseSVN>Paste로 이동 또는 복사를 수행하는 것이다.
 

사용자 삽입 이미지

 
내부적으로 이동은 복사후 삭제로 구성되는데 이동으로 CLI 명령으로는 "svn move 원본 대상", "svn mv 원본 대상", "svn rename 원본 대상", "svn ren 원본 대상"이 모두 같은 의미로 동작할 수 있다. 복사 및 삭제 명령으로 바꾸어 보면 "svn copy 원본 대상", "svn delete 원본"으로 이루어 질 수 있다.
 
수정이든 삭제, 추가, 이동, 복사, 이름 변경이든 작업 사본에 대한 로컬 작업은 작업 완료 처리를 하지 않으면 저장소에 반영되지 않고 타인들과 내용을 공유할 수도 없다. 작업을 완료했으면  작업 사항을 위에서 언급한 "svn status" 명령이나 탐색기팝업 메뉴>TortoiseSVN>Check for modifications를 통해서 확인하고 최종적으로 "svn commit -m 로그메시지 완료 경로"명령이나 완료 경로 탐색기 팝업 메뉴>SVN Commit으로 로그 메시지와 함께 커밋하면 된다. 커밋 시점에서 주의할 사항은 커밋과 동시에 리비전이 올라가는데 이미 타 개발자에 의해 커밋된 것이 있는지 최신 버전으로 업데이트 한 다음 커밋을 수행하는 것과 로그 메시지를 정확히 입력해서 연관되는 이슈 트래커 번호나 기타 정보가 충분히 로그 메시지에 남도록 해야 한다.
 

사용자 삽입 이미지

 
 
 

* 패치 파일(Patch file)

패치 파일은 오픈 소스 프로젝트에서 많이 사용하는 방법으로 아직 개발 스태프가 아닌 사람에게 저장소에 대한 쓰기 접근 권한을 부여할 수 없으므로 이런 경우에는 관심있는 개발자가 프로젝트를 자신의 로컬 컴퓨터에 체크아웃 받은 다음 나름의 수정이나 보완 사항을 적용해서 테스트해본후 프로젝트 스태프에게 패치를 제공하고 프로젝트 스태프는 패치 내용을 검토하여 유용하다고 판단되면 저장소에 패치를 적용하는 방식으로 사용한다.
 
패치는 작업중인 상태를 따로 저장해 두었다가 다른 작업을 수행한 다음 다시 진행하는 경우 처럼 현 작업 상태를 보관할 때도 유용하다. 패치를 만들어 놓고 Revert로 작업 내용을 취소하고 다른 작업을 수행한 다음 보관해둔 패치를 적용하면 원래 작업하던 상태로 작업을 계속 진행할 수 있는 것이다.

 
패치를 만드는 방법은 작업을 수행한 작업 사본에서 작업 완료 처리인 커밋(Commit) 대신 "svn diff 작업경로 > 패치파일명" 명령이나 작업 폴더 팝업 메뉴>TortoiseSVN>Create patch로 패치 파일을 생성할 수 있다.
 

사용자 삽입 이미지

 
패치 파일의 확장자는 *.patch나 *.diff로 보관한다.
 
패치 파일의 내용은 아래와 같은 형태인데

Index: test2.txt
===================================================================
--- test2.txt (revision 21)
+++ test2.txt (working copy)
@@ -6,4 +6,4 @@
 */
 
 text file test 222333
-4444
+44445555


파일 내용에서 리비전 정보를 찾을 수 있듯 패치를 작업 사본에 반영하는 작업은 패치의 리비전과 작업사본의 리비전이 같으면 큰 문제가 없으나 리비전이 서로 다르면 복잡한 상황이 있을 수 있다. 패치를 작업 사본에 적용하는 방법은 "svn patch 패치 파일명" 명령이나 작업 폴더 팝업 메뉴>TortoiseSVN>Apply patch로 패치 파일을 적용할 수 있다. TortoiseSVN의 패치 적용은 아래의 글미과 같이 TortoiseMerge를 통해서 편리하게 수행할 수 있다.
 

사용자 삽입 이미지

 
 
 

* 브랜치와 태그(Branches/Tags)

서브버전 저장소를 생성할 때  trunk/branches/tags라는 폴더를 자동으로 만들도록 했는데, 통상 작업은 trunk에서 수행하고 핵심 코드는 메인인 trunk에 유지하면서 발전시켜 나간다. 그런데 핵심 제품을 유지 발전 시키면서도 기존 기능에 크게 영향을 미치는 메이저 릴리즈등의 경우에는 메인 저장소와 혼합하여 개발을 진행시키기에는 무리가 있다. 이런 경우 메인 코드와 분리하여 별도의 가지로 프로젝트를 진행할 수 있도록 하는 것이 브랜치이다. 메인과는 분리되어 브랜치는 나름의 개발 과정을 밟다가 안정화 단계에 들어서면 메인 Truck에 머지(Merge)하는 방식으로 운용하는 것이다.
 
태그는 특정한 리비전에 표시를 해두는 것으로 예를 들면 특정 릴리즈에 표시를 해두고 해당 버전에 대한 개발이나 수정이 필요할때 활용하는 것이다. 버전별로 기능이 다르고 여러 버전으로 고객 서비스를 제공하는 곳에서는 많이 활용하는 방법이다. 태그는 특정 시점의 고정된 모습으로 태그에 대한 직접적인 수정은 지양하고 태그에 대한 수정이 필요하면 태그를 기반으로 브랜치를 만든다음 브랜드에서 수정이 완료되면 해당 브랜치를 기반으로 새롭게 태그를 생성하는 방식으로 운용한다.
 
서브버전에서 브랜치와 태그는 내용을 그대로 복사하는 방식이 아니라 링크를 거는 방식이기 때문에 저장 공간을 많이 차지 하거나 생성에 오랜 시간을 소모하지 않으므로 체계적으로 활용하는 것이 좋다.
 
브랜치나 태그 생성은 "svn copy -m 로그메시지 대상 브랜치및태그URL"명령이나 탐색기 팝업 메뉴>TortoiseSVN>Branch/Tag...를 통해서 수행할 수 있다.
 

사용자 삽입 이미지

 
브랜치나 태그를 만들 때 대상 원본은 3가지로 할 수 있는데 최신 리비전(HEAD revision in the repository)과 특정 리비전(Specific revision in repository)의 경우에는 로컬에 있는 작업 사본과는 무관하게 저장소에 있는 내용으로 브랜치나 태그를 만드는 것으로 "svn copy ..."명령에서도 대상에 저장소 URL를 기술하면 된다.(저장소 URL은 앞서 언급한 "* 저장소 생성하기와 저장소 URL"를 참조한다) 작업사본을 브랜치와 태그의 대상으로 할 경우에는 작업 사본이 무엇을 기준으로 했는지 해당 저장소 내용과 로컬에서 수정한 내용이 반영되는 것이다. 중요한 입력 사항은 브랜치 및 태그 URL로 최초 저장소를 생성했던 /branches나 /tags 에 버전 또는 프로젝트 코드명을 붙여 생성한다. 
 
브랜치나 태그에서 작업할 때는 메인 /trunk 대신 /branches나 /tags URL로 체크아웃해서 작업하면 된다. 그런데 체크아웃 받은 작업 사본의 기준 URL을 바꾸고자 할 때, 예를 들면 특정 브랜치에서 작업하던 내용을 가지고 메인에서 작업하고 싶을 때는 "svn switch 대상URL 작업경로" 명령이나 작업경로 루트의 팝업 메뉴>TortoiseSVN>Switch...으로 URL을 전환시킬 수 있다.

사용자 삽입 이미지

 
서브버전 Switch 전후로 기준 저장소 URL이 무엇인지 확인하는 방법은 "svn info" 또는 "svn info 작업경로" 명령이나 탐색기 팝업 메뉴>속성>Subversion 탭으로 확인할 수 있다.
 

사용자 삽입 이미지

  
 
브랜치와 태그를 적용하며 프로젝트가 발전해온 과정을 TortoiseSVN에서는 그래픽으로 한눈에 볼 수도 있는데 아래의 그림은 국내 오픈소스 DBMS인 큐브리드의 리비전 그래프의 일부로 리비전 그래프는 각 프로젝트에서 탐색기 팝업메뉴>TortoiseSVN>Revision graph로 확인해 볼 수 있다.
 

사용자 삽입 이미지

 
 
 

* 병합(Merge)

앞서 태그는 특정 시점의 리비전에 표시를 해둔 것으로 태그에 대한 수정 작업을  하지 않는다고 언급했는데, 브랜치는 메인 trunk 및 다른 브랜치와는 별개로 독자적인 개발 프로세스를 진행한다. 브랜치에 대한 개발 프로세스가 안정화되고 완료되면 다시 메인 trunk나 다른 브랜치와 합치는 작업이 필요한데 이과정을 병합(Merge)이라한다.
 
병합 과정은 반드시 작업 사본을 기반으로 수행한다. 앞서 브랜치나 태그는 작업 사본 없이도 저장소 내용만으로도 브랜치나 태그를 생성할 수 있었지만 병합을 위해서는 작업 사본이 먼저 준비되어야 한다는 것이다. 또한 병합 작업 과정에서의 작업 사본은 되도록 저장소 내용을 내려받은 그대로의 상태로 수정없이 작업을 수행하는 것이 좋다. 병합 과정에 문제가 있거나 혼란한 상황으로 수습하기 어려운 상태라면 서브버전 Revert로 간단하게 되돌릴 수 있기 때문이다.
 
병합원본과(From, Source) 병합결과(To, Destination) 사이의 병합의 과정은 둘 사이의 차이를 검토하는 병합 내용의 검토, 병합 수행, 충돌 해소 및 결과 확인, 병합 완료(커밋)의 과정으로 수행한다.
 
브랜치 또는 특정 리버전과 비교는 "svn diff 병합원본URL 병합결과URL" 명령이나 탐색기 파일섹션을 Shift+우클릭한 팝업 메뉴에서 TortoiseSVN>Diff with URL로 검토해 볼 수 있다.
 

사용자 삽입 이미지
사용자 삽입 이미지

 
병합의 수행은 명령행에서는 "svn merge 병합원본URL 병합결과URL 작업사본경로"로 수행하고 병합 테스트를 위해서는 --dry-run 스위치를 추가하면 된다.
윈도우에서의 병합 수행은 탐색기 팝업메뉴>TortoiseSVN>Merge로 할 수 있는데, 병합 방법으로 3가지가 있는데 각각의 내용은 아래와 같다.
 

사용자 삽입 이미지

 

  • 리비전 범위 병합
    브랜치나 Trunk에 관계없이 특정 리비전 범위 가운데 있는 변동 사항을 작업 사본에 적용할 때 사용한다.
    사용자 삽입 이미지
  • 브랜치 재통합
    메인 Trunk에서 분리했던 브랜치의 작업 완료후 Trunk에 재통합 할 때 사용하는 것으로 trunk에 대한 작업 사본을 준비하고 병합 원본 URL로 브랜치를 지정하는 방식이다.
    사용자 삽입 이미지
  • 트리 비교 병합
    두개의 서로 다른 트리간의 차이를 작업 사본에 반영할 때 사용한다.
    사용자 삽입 이미지


 
위의 설명과 같이 병합 타입을 따른 선택과 정보 입력을 하고 [Next>]버튼을 클릭하면 병합 타입별 옵션을 지정할 수 있고 명령행 스위치--dry-run 처럼 [Test merge]버튼을 통해서 실제 병합 이전에 테스트를 진행할 수 있다.
 

사용자 삽입 이미지

 
병합 과정에 충돌이 발생하면 아래 같은 창을 통해서 즉시 충돌을 해소할 수도 있고 추후 정리할 수도 있다.
 

사용자 삽입 이미지

 
 
 

* 잠금(Locking)

앞서 언급 했던 서브버전 업데이트 시점의 충돌 과정에서 소스코드와 같은 텍스트 파일에서는 내가 수정중인 파일을 다른 사람이 먼저 수정하여 커밋했더라도 동일한 라인이 아니라면 충돌없이 병합되고 충돌이 있더라도 마킹을 포함한 충돌 해소 가이드로 어렵지 않게 충돌을 해소할 수 있었지만, 이미지나 워드, 엑셀 문서, DLL이나 실행파일 같은 바이너리 파일들은 동시 작업으로 인한 충돌의 해결이 어렵다. 이런 경우 특정 파일의 수정 작업에 잠금 장치를 두어 잠금을 소유한 사람만 커밋할 수 있고 잠금 상태에서는 다른 사람은 커밋할 수 없도록 하여 혼란을 예방할 수 있다.
 
명령행에서는 "svn lock -m 잠금메시지 잠글경로" 명령으로 잠그고 "svn unlock 잠근경로" 명령으로 해제할 수 있고 윈도우에서는 탐색기에서 잠글 파일의 팝업메뉴>TortoiseSVN>Get lock으로 잠그고(잠근 파일안 자물쇠 아이콘으로 표시된다), 잠근 파일의 팝업메뉴>TortoiseSVN>Release lock으로 해제할 수 있다.
 

사용자 삽입 이미지

 


출처 : http://www.dongwun.com/tc/174