요즘 떠오르는 버전관리 프로그램인 서브버전의 사용법에 대해서 설명한다. 여기서는 Redhat 9 를 기준으로 설명한다.
vpos 와 scvos 에 직접 적용해볼 것이다.
설치
소스파일(.tar)을 구해서 설치할 수도 있지만, 여기서는 rpm 파일로 간단히 설치할 것이다.
필요한 파일은 다음과 같다.
- apr-0.9.12-1.i386.rpm
- apr-util-0.9.12-1.i386.rpm
- neon-0.24.7-1.i386.rpm
- 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/ 에서 아래의 패키지를 다운받는다.
- apr-0.9.5-0.2.i386.rpm
- neon-0.24.7-1.i386.rpm
- subversion-1.3.2-1.rh90.i386.rpm
- apr-util-0.9.5-0.1.i386.rpm
- 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 이다.