요즘 떠오르는 버전관리 프로그램인 서브버전의 사용법에 대해서 설명한다. 여기서는 Redhat 9 를 기준으로 설명한다.
vpos 와 scvos 에 직접 적용해볼 것이다.

설치

소스파일(.tar)을 구해서 설치할 수도 있지만, 여기서는 rpm 파일로 간단히 설치할 것이다.
필요한 파일은 다음과 같다.

  1. apr-0.9.12-1.i386.rpm
  2. apr-util-0.9.12-1.i386.rpm
  3. neon-0.24.7-1.i386.rpm
  4. subversion-1.4.4-1.i386.rpm

-Uvh 옵션을 사용해서 설치한다.

실제로 Redhat 9 에서 위의 패키지들을 받아 설치했음에도 불구하고 의존성 오류 때문에 정상적으로 설치하지 못하였다.
http://the.earth.li/pub/subversion/summersoft.fay.ar.us/pub/subversion/latest/redhat-9.0/bin/ 에서 아래의 패키지를 다운받는다.

  1. apr-0.9.5-0.2.i386.rpm
  2. neon-0.24.7-1.i386.rpm
  3. subversion-1.3.2-1.rh90.i386.rpm
  4. apr-util-0.9.5-0.1.i386.rpm
  5. neon-devel-0.24.7-1.i386.rpm

설치 후에 제대로 수행되는지 확인한다. 만일 실행 에러가 발생한다면, 기존의 이미 패키지들이 설치되어 있는지 확인한다. 설치되어 있다면 삭제 후 다시 설치한다.

맛보기

가장 먼저 저장소를 생성해야 한다. 여기서는 /opt 디렉토리를 기준으로 한다.

#mkdir /opt
#svnadmin create /opt

이제 소스코드를 저장소에 저장한다. /src/ 아래에 vpos_tiny 라는 소스코드를 저장해보겠다.

#cd /src/vpos_tiny
#svn import -m "vpos tiny version" . file:///opt/ 

vpos_tiny 안에 있는 모든 파일을 저장소에 저장한다는 의미다.

이제 반대로 체크아웃을 해보자! 작업을 시작한다고 가정하고, /tmp 디렉토리 안에서 체크아웃을 할 것이다.

#cd /tmp
#svn co file:///opt/ vpos_tiny

위의 명령어는 /tmp 아래에 vpos_tiny 라는 이름의 디렉토리를 만들고 그 안에 소스코드를 저장소로 부터 가져온다.

기본적으로 서브버전은 저장소에 저장되어 있는 가장 최신 리비전을 체크아웃한다. 만일 과거의 어떤 특정 리비전이 필요하다면 -r 옵션으로 지정해주어야 한다.

#svn checkout -r 7 file:///opt/ vpos_tiny

현재 작업본이 어떤 리비전인지 확인하기 위해서는

#svn info vpos_tiny
Path: .
URL: file:///opt
Repository Root: file:///opt
Repository UUID: 8ca7b6cd-0137-0410-824f-de22541c0386
Revision: 3
Node Kind: directory
Schedule: normal
Last Changed Author: root
Last Changed Rev: 3
Last Changed Date: 2007-08-06 21:35:22 +0900 (Mon, 06 Aug 2007)

가져온 코드를 수정하고 나서 이것을 저장소에 적용(commit) 시키는 방법을 알아보자!

#svn commit -m "modify a file"
Sending        1
Transmitting file data .
Committed revision 2.
#svn update

저장소에 파일이나 디렉토리를 추가할 때에는 svn add 명령어를 사용한다. 디렉토리를 추가하는 경우, 서브버전은 그 디렉토리의 모든 파일들과 모든 하위 디렉토리들도 자동으로 추가한다.

#cd /tmp
#mkdir timelib      # tmp 아래에 새로운 디렉토리 생성
#cd timelib
#touch time.c       # 소스파일 생성
#cd ..
#svn add timelib
#svn commit -m "add to timelib"

이번에는 삭제를 해보겠다.

#svn del timelib
#svn commit -m "del to timelib"

일반 cp 명령어로 복사를 할 수 있지만, 서브비전에서 제공하는 copy 명령어를 사용하면, 히스토리를 기억하기 때문에 나중에 로그로 출력할 수 있다.

#svn copy Number.txt Data.txt
#svn commit -m "Created Data.txt"
#svn log Data.txt       # Data.txt 파일에 대한 로그를 출력

이제 파일 이름을 바꿔보자!

#svn move Time.c Clock.c
#svn commit -m "Renamed Time to Clock"

방법은 다음과 같다.

#svn move timelib util
#svn commit -m "Renamed timelib to utile"

저장소에 있는 파일의 한 버전과 지역 복사본에서 수정한 버전을 비교할 수도 있고, 저장소에 있는 파일의 두 버전 사이의 차이를 볼 수도 있다.

#svn diff time.c
Index: test
===================================================================
--- test        (revision 6)
+++ test        (working copy)
@@ -1,3 +1,5 @@
+test
+test21
 0+1 records in
 1+0 records out
 dd if=images/vpos_kernel_binary of=images/vpos.bin bs=1k seek=1
@@ -2,2 +4,3 @@
 208+1 records in
-208+1 records out
+208+1 gsrecords out
+test32

특정 파일의 두 리비전들을 비교할 때에는 svn diff 에서 -r 옵션으로 해당 리비전 범위를 지정한다.

#svn diff -r19:21 clock.c

작업본과 저장소의 최신 리비전을 비교하려면

#\svn diff -r HEAD clock.c

한다.

자신 또는 다른 팀원들이 파일을 변경하면서 기록했던 메세지들을 볼 수 있다.
다음은 특정 파일의 로그이다.

#svn log clock.c
------------------------------------------------------------------------
r3 | root | 2007-08-06 21:35:22 +0900 (Mon, 06 Aug 2007) | 1 line
 
modify test file
------------------------------------------------------------------------
r1 | root | 2007-08-06 20:45:52 +0900 (Mon, 06 Aug 2007) | 1 line
 
vpos tiny version
------------------------------------------------------------------------

다음은 전체 저장소의 로그이다.

#svn log
------------------------------------------------------------------------
r6 | root | 2007-08-06 22:21:24 +0900 (Mon, 06 Aug 2007) | 1 line
 
delete to a dictory
------------------------------------------------------------------------
r5 | root | 2007-08-06 22:20:32 +0900 (Mon, 06 Aug 2007) | 1 line
 
add a dictory
------------------------------------------------------------------------
r4 | root | 2007-08-06 22:17:49 +0900 (Mon, 06 Aug 2007) | 1 line
 
delete 1 file
------------------------------------------------------------------------
r3 | root | 2007-08-06 21:35:22 +0900 (Mon, 06 Aug 2007) | 1 line
 
modify test file
------------------------------------------------------------------------
r2 | root | 2007-08-06 21:29:00 +0900 (Mon, 06 Aug 2007) | 1 line
 
modify 1 file
------------------------------------------------------------------------
r1 | root | 2007-08-06 20:45:52 +0900 (Mon, 06 Aug 2007) | 1 line
 
vpos tiny version
------------------------------------------------------------------------

svn blame 명령은 하나나 그 이상의 파일들의 변경 사항들을 보여준다. 이 명령이 출력하는 각 줄은 해당 파일 줄의 최신 리비전 번호, 변경한 저자, 그리고 변경된 내용으로 구성된다.

#svn blame clock.c
     1       root 0+1 records in
     1       root 1+0 records out
     1       root dd if=images/vpos_kernel_binary of=images/vpos.bin bs=1k seek=1
     1       root 208+1 records in
     1       root 208+1 records out

이 명령을 통해 어떤 리비전에서 어떤 줄을 누가 어떻게 변경했는지 한 눈에 파악할 수 있다. svn blame 역시 -r 옵션을 지원한다.

프로젝트를 진행하다보면 하지 말았어야 하는 변경을 가하고는 후회를 하기도 한다. 그 변경이 지역 작업본 안에서의 변경들이고 아직 체크인하지 않았다면 그냥 'svn revert' 로 변경들을 날려버리면 된다.
만일 커밋을 수행했다면, 아래와 같이

#svn merge -r 27:26 clock.c

하면 된다. 이 명령은 clock.c 의 리비전 27 과 26 사이의 변화를 계산하고 그것을 작업본에 적용하라고 한 것이다. 리비전 범위를 27:26 으로 한 것은(26:27 이 아니라), 이 경우 변경을 과거로 되돌려야 하기 때문이다.
만일 특정 파일이 아닌 디렉토리 전체를 되돌려야 한다면,

#svn merge -r 27:26 .

위와 같이 한다.

자신의 작업본이 어떤 상태인지를 알고 싶다면,

#svn status
M      test      # 저장소의 코드와 다름, 즉 수정되었음
?      a.c       # a.c 를 아직 저장소에 추가하지 않았음(그래서 아직 버전 관리 대상이 아님)

와 같이 한다. 만일 작업 도중에 누군가가 저장소의 파일을 갱신했을 수 있다. 그런 경우에는 제대로된 상태를 파악할 수 없다.

#svn status --show-updates
   *    26    test
M  *    27    clock.c
Status against revision: 30

위의 결과에서 test 와 clock.c 는 최신이 아니다. 저장소의 최신버전은 현재 30 이다.

  • computer/programming/서브버전_사용하기.txt
  • Last modified: 3 years ago
  • by likewind