CVS Guide

 

 

 

 

 

 

 

 

 

 

최초 작성일 : 2003년 4월 3일 오후 2시 50분

Last modified: Sun Dec 19 01:35:43 +0900 2004

작성자 : 윤경구


 

1.                        CVS 개관

1.1.   CVSROOT

CVSROOT는 CVS 저장소를 나타내는 개념으로, CVS 클라이언트를 사용할 때 CVSROOT를 환경 변수나 명령행 옵션 등의 형태로 반드시 지정하여야 한다.

CVS를 암호 서버(pserver) 방식의 서버/클라이언트 형태로 사용할 때에는 CVSROOT는 다음과 같은 형식을 가진다.

 

:pserver:<사용자 id>@<호스트 주소>:<저장소 디렉토리>

 

예를 들어, yoonforh라는 id를 가진 사용자가 my.host.name 호스트의 /data/cvsroot/Blah 라는 저장소 디렉토리에 패스워드 서버 방식으로 접근하고자 할 때에는 다음과 같이 CVSROOT를 지정하면 된다.

 

:pserver:yoonforh@my.host.name:/data/cvsroot/Blah

 

1.2.   CVS 명령

1.2.1. checkout

checkout은 CVS 클라이언트에서 처음으로 모듈을 가져올 때 사용한다. 다음은 yadda이라는 모듈을 가져오는 명령이다.

 

사용예 : cvs checkout yadda

 

CVSROOT는 환경변수로 지정하거나 cvs 명령 앞에 –d 옵션을 사용하여 지정할 수 있다.

 

사용예 : cvs –d :pserver:yoonforh@my.host.name:/data/cvsroot/Blah checkout yadda

 

1.2.2. login/logout

패스워드 서버 방식을 사용할 때 CVS 클라이언트가 CVS 서버로부터 인증을 받기 위해 login 명령을 사용한다. login이 성공하면 사용자의 홈 디렉토리의 .cvspass 파일에 패스워드를 저장해둔다.

logout을 하면 저장된 패스워드 항목이 삭제되어 다음 명령을 실행하려면 다시 로그인을 필요로 한다.

 

사용예 : cvs login

 

1.2.3. 기타 명령

*       commit : 지역적으로 변경된 파일을 서버에 저장한다.

*       update : 서버의 변경 사항들을 지역의 파일에 반영한다.

*       add : CVS 저장소에 파일을 등록한다. add된 파일은 commit을 해야 실제로 추가된다.

*       remove : CVS 저장소에 있는 파일을 삭제한다. remove된 파일은 commit을 해야 실제로 삭제된다.

 

1.3. CVS 사용 팁

1.3.1. 파일 이름 변경 혹은 이동

cvs에서 파일 이름 변경은 지원하지 않는다.

따라서 파일 이름을 변경하거나 이동하고자 할 때에는 파일을 원하는 이름이나 장소로 복사한 다음 기존 파일을 remove하고 새 파일을 add하는 방법을 많이 사용한다.

 

1.3.2. commit 시 conflict 해결

지역적으로 파일을 수정하는 동안 해당 파일이 다른 사람에 의해 CVS 서버에 갱신될 경우 conflict이 발생한다.

이 경우, conflict를 diff를 통해 비교한 다음 merge를 하여 commit하여야 한다. CVS를 지원하는 통합 개발 환경은 대부분 간편한 merge 기능을 지원할 것이다.

 

1.3.3. 잘못된 commit 대 한 rollback 방법

1.5 버전의 Test.java 소스 코드를 1.3 버전으로 되돌리고 싶을 때에는 다음과 같이 merge 방법을 사용할 수 있다.

 

     $ cvs update -j 1.5 -j 1.3 Test.java

 

이 명령은 1.3과 1.5 버전 사이의 변화를 모두 취소하여 현재 지역에 있는 소스 파일에 반영한다. 이때, 두 버전의 순서에 주의해야 한다.

 

이 방법을 사용하면 cvs remove를 사용하여 삭제했던 파일을 되살릴 수도 있는데 예를 들어 1.1 버전에 존재했던 Removed.java 파일을 cvs remove를 사용하여 삭제했을 경우 (cvs remove도 버전 정보를 추가하므로 1.2라고 하자) 이 파일을 다시 되살리고자 할 때에는 앞의 방법과 마찬가지로 사용할 수 있다.

 

     $ cvs update -j 1.2 -j 1.1 Removed.java

     U Removed.java

 

이 방법은 지역의 파일에만 결과를 반영하므로 commit을 해줘야 서버에 영구적으로 반영된다.


1.3.4. 특정 날짜 이후로 변경된 사항에 대해서만 diff

모듈에서 특정 날짜 이후로 변경된 부분만 찾으려고 할 때, rdiff를 사용할 수 있다.

     $ cvs rdiff -D 2004-01-01 <module names>


 

2.                        CVS 태그 사용법

2.1. cvs 태그

cvs 태그는 특정 시기의 소스들의 버전에 태그 이름을 지정함으로써 추후, 필요할 경우 지정한 태그 이름을 사용하여 해당 시기의 소스들을 가져올 수 있는 논리적인 버전 분기 방법이다.

 

2.2. cvs 태그 지정

2.2.1. cvs tag/rtag 사용법

다음과 같이 사용한다. 타겟이 디렉토리이면 재귀적으로 적용된다. 따라서 보통 소스 루트 디렉토리에서 타겟을 .(현재 디렉토리)으로 지정하면 전체 소스에 태그가 지정된다. (타겟을 생략하면 재귀적으로 적용된다.)

 

cvs tag <태그 이름> <타겟>

 

cvs rtag 명령은 cvs tag 명령과 유사하나 타겟이 작업 디렉토리가 아닌 CVS 저장소(repository)에 대한 경로, 즉 모듈 이름이라는 점이 다르다.

cvs tag를 사용할 때 흔히 만나는 실수는 태깅이 이미 체크인된 저장소에 대해서만 일어난다는 점이다. 따라서 지역적으로 수정된 파일이 있는지 여부를 검사할 수 있는 –c 옵션을 항상 함께 사용하는 것이 좋다.

예를 들면 다음과 같이 사용한다.

 

     $ cvs tag -c rel-0-4 .

     cvs tag: backend.c is locally modified

     cvs [tag aborted]: correct the above errors first!

 

2.2.2. cvs 태그 삭제/수정

지정된 cvs 태그를 삭제하거나 이름을 변경하고자 할 때에는 다음과 같이 사용한다.

 

cvs tag –r <이전 이름> <새 이름> <타겟>

 

cvs tag –d <삭제할 태그 이름> <타겟>

 

 

2.3. 특정 cvs 태그 버전의 소스 가져오기

cvs checkout을 할 때 –r 옵션을 사용하여 태그를 지정하면 해당 태그의 소스들이 체크아웃된다.

 

cvs checkout –r <태그 이름> <모듈 이름>

 

3.   CVS 브랜치 사용법

3.1. cvs 브랜치

cvs 브랜치는 특정 시기의 소스들의 버전에 브랜치 이름을 지정하고 해당 브랜치를 별도로 체크아웃해서 개발할 수 있게 함으로써, 소스 코드의 개발 흐름을 분기하는 방법이다.

 

3.2. cvs 브랜치 지정

cvs에서 브랜치는 태그와 마찬가지로 tar/rtag 명령을 사용한다. 적용되는 방식은 태그와 동일하다.

 

cvs tag -b <브랜치 이름> <타겟>

 

이미 만들어진 브랜치로부터 다시 브랜치를 만들고 싶을 경우에는 다음과 같이 rtag 명령을 사용하면 된다. 기존 브랜치나 태그에 대해 fix 버전을 만들 때 자주 사용된다. 


cvs rtag -b -r <원래 브랜치/태그 이름> <새 브랜치 이름> 모듈 이름


아래의 경우는 특정 브랜치(태그)에서 특정 시점에 있었던 파일을 기준으로 브랜치(태그)를 만들게 된다.

cvs rtag -b -r <원래 브랜치/태그 이름>:<날짜 포맷> <새 브랜치 이름> 모듈 이름

(example) cvs rtag -b -r OLD_BRANCH:"23 Jan 2010" NEW_BRANCH module1


3.3. 특정 cvs 브랜치 작업하기


3.3.1. cvs 브랜치 체크아웃하기



지정된 cvs 브랜치에서 개발을 하고자 한다면 다음과 같이 해당 브랜치의 코드를 체크아웃한다.

 

cvs checkout -r <브랜치 이름> <모듈 이름>


3.3.2. cvs 브랜치 Merge하기

다음의 merge는 브랜치가 아닌 태그의 경우에도 동일하게 적용

 

 

4.                        CVS 서버 설치 방법

1.       cvs p-server setup

환경 설정 파일에서 pserver 서비스를 등록한다. 다음과 같이 한다.

 

/etc/services

cvspserver      2401/tcp

 

/etc/inetd.conf

cvspserver       stream tcp nowait root /usr/local/bin/cvs.sh  cvs.sh

 

/usr/local/bin/cvs.sh

#!/bin/sh

/usr/local/bin/cvs -f --allow-root=/data/cvsroot/Blah --allow-root=/data/cvsroot/Portal --allow-root=/data/cvsroot/CodeGen --allow-root=/data/cvsroot/CvsTest pserver

 

2.       cvs 사용자를 별도로 생성한다. (예:cvsuser) 항상 이 사용자 권한을 통하여 접속하게 한다.

 

 

3.       CVSROOT 디렉토리를 생성한 다음 초기화하여 초기화 파일이 생성되도록 한다.

 

cvs -d $CVSROOT init

 

4.       소 스 디렉토리로부터 임포트하여 CVS 루트에 모듈을 등록한다.

 

cd source_directory

cvs import [-options] repository_name vendor_tag release_tag

 

5.       패 스워드 파일과 바이너리 파일 확장자 등을 설정한다.

$CVSROOT/CVSROOT 디렉토리에 있는 passwd, readers, writers, cvswrappers 파일들이 각각 그 역할을 한다.

Passwd 파일을 관리할 때에는 아파치 서버에 포함된 htpasswd  유틸리티를 활용하여 등록한 다음 세번째 컬럼에 cvsuser를 추가 지정하면 된다

 

) yoonforh:PASSWORDENCRYPTED:cvsuser

 

4.   윈 도우용 CVS 클라이언트 (WINCVS) 사용법

 

4.1. WINCVS 설치

1.      wincvs 다운로드 받아 압축을 풀고 설치한다.

http://sourceforge.net/project/showfiles.php?group_id=10072&release_id=83299

2.      설치하여 처음 실행하면 WinCvs Preferences 대화상자가 나타난다. (혹은 메뉴에서 Admin->Preferences)

여기에서 설정해야 데이터는 다음과 같다.

 

a. General TAB

Authentication : pserver

Path : /data/cvsroot/Blah

Host address : my.host.name

User name : <your id>

CVSROOT : <your id>@my.host.name:/data/cvsroot/Blah

 

b. WinCvs TAB

HOME : 적당한 경로. 디렉토리에 로그인 패스워드가 저장됨.

Default viewer used to open : 기본 뷰어 프로그램 지정

 

이상 완료후 OK.

 

3.      이제 로그인한다.

메뉴에서 Admin->Login

패스워드를 입력한다.

여기까지 성공했으면 일단 CVS 제대로 설치된 것이다.

 

4.      모듈을 체크아웃한다.
test
체크인하기 위해 test라는 모듈이 만들어져 있다.

 

a.      메뉴에서 Create->Checkout module... 실행한다.

b.      대화상자에서 Module name and path on the server : test 입력

c.      Local folder to checkout to: 체크아웃을 디렉토리를 정한다. 나중에 디렉토리에 체크인할 파일들을 둬야 한다.

 

OK 하면 된다.

성공했으면 test 라는 디렉토리가 생성되고 Modules 윈도우에서 test라는 폴더가 체크되어 나타난다.

( : 항상 아랫쪽에 있는 명령 실행 윈도우의 결과가 0 끝났는지 확인한다. *****CVS exited normally with code 0*****)

 

5.      파일을 체크아웃한 디렉토리 아래에 생성된 test 디렉토리로 복사한다. (서브디렉토리를 만들어 복사해도 된다.)

해당 파일을 CVS repository 등록하기 위해서 먼저 add 해야 한다.

wincvs에서 Modules 윈도우에서 만들어진 test 디렉토리를 선택한다.

서브 디렉토리가 있는 경우 해당 서브 디렉토리를 선택한 다음 Modify->Add selection 한다.

다음 서브 디렉토리에 있는 파일들을 Modify->Add selection/Add binary/Add unicode (파일 종류에 따라 선택)하여 add한다.

서브 디렉토리가 없는 경우에도 마찬가지로 파일을 선택하여 add한다.

이때 주의할 점은 텍스트 파일의 경우 Add selection, 바이너리 파일의 경우 Add binary 선택한다는 점이다. 유니코드 텍스트의 경우는 Add unicode 혹은 Add binary 한다. (Add unicode 성공할지 자신 없음)

이제 cvs repository 파일에 대한 정보가 입력되었다. (아직 파일 자체는 전송 안됨)

 

6.      파일을 add하거나 modify 경우에 서버로 파일 자체 정보를 보내고자 경우 commit 해야 한다.

commit 파일들을 선택한 다음 Modify->commit... 한다.

이때 다이얼로그에서 Enter the log message : 변경된 내용 등을 입력하는 것이 나중에 버전 정보를 확인할 도움이 된다.

OK 하면 파일이 실제 cvs 서버의 repository 전송된다.

 

7.      파일을 delete하고자 경우 해당 파일을 선택한 다음 Modify->Remove 선택한다.

그리고 마찬가지로 commit 해줘야 실제로 지워진 것으로 서버에 표시된다.

 

8.      이후로는 wincvs 실행시킨 test 디렉토리로 가서 add, delete, commit 등을 실행할 있다.

4.2. 사용 전 준비 사항

먼저 cvs 서버에 사용자를 등록해야 한다.

접속하는 ip 대해서 cvs 접근을 허가해줘야 한다.

 

5.                        참 고 자료

5.1. CVS 관련 사이트

http://www.cvsnt.org : CVS NT 홈페이지

http://www.wincvs.org : WinCVS 홈페이지

http://www.prima.eu.org/tobez/cvs-howto.html : Chrooted tunnelled read-write CVS server

http://www.gnu.org/software/cvs/cvs.html : Gnu CVS 홈페이지

http://www.gnu.org/manual/cvs/index.html : CVS 온라인 매뉴얼

http://ftp.gnu.org/non-gnu/cvs/source/stable/1.11.22/cederqvist-1.11.22.pdf : CVS 온라인 매뉴얼 (PDF)

 


Yoon Kyung Koo <yoonforh at gmail dot com>