반응형
 

CVS란 무엇일까?

version 관리 시스템입니다.


CVS의 장점

소스 파일에 대한 HISTORY 레코드를 가지고 있습니다.

매 작업 단계마다 코드를 저장할 수 있습니다.

원하는 단계의 코드를 언제라도 꺼내 볼 수 있습니다.

cvs는 각 단계에서 변경된 부분만을 저장하기 때문에 저장 공간을 많이 필요로 하지  않습니다.

각 단계마다 작업한 내용을 글로 적어 함께 저장할 수 있으므로 개발 내용을 한눈에 알아볼 수 있게 해 줍니다.

같은 파일도 여러 사람이 함께 작업할 수 있습니다.

Unix 환경은 물론,Windows나 Macintosh에서도 사용할 수 있어 각 개발자들이 원하는 환경에서 작업할 수 있습니다.



CVS 사용 방식

1. 저장소를 초기화합니다. (CVS 관리자)

2. 프로젝트를 초기화합니다. (프로젝트 관리자)

3. 작업 공간을 마련합니다. (개발자)

4. 실제 작업을 합니다. (개발자)

5. 자신의 작업 내용을 저장소에 저장하고 다른 개발자의 작업 내용을 받아옵니다. (개발자)



1. 저장소 초기화

CVS를 사용하기 위해서 가장 먼저 할 일은 각 프로젝트의 파일들을 저장할 저장소(repository)의 위치를 정하는 것입니다

# cvs -d /home/cvs init

여기서 -d는 저장소의 위치를 나타내며, 마지막의 init가 CVS 명령입니다. 물론 이 명령을 사용하기 위해서는 /home에 쓰기 권한을 갖고 있어야 합니다. 그러므로 대개의 경우 저장소의 초기화는 root 권한을 가진 시스템 관리자가 합니다. 명령이 실행되고 나면 /home에 CVS란 디렉토리가 생기고, 그 안에는 CVSROOT란 디렉토리가 있습니다.


2.계정이 있을 경우


권한 부여

저장소를 만들었으면 CVS를 이용할 개발자들에게 저장소를 사용할 수 있는 권한을 주어야 합니다. 권한 부여 방법은 개발자들이 저장소가 위치한 시스템에 계정이 있는지에 따라 나뉩니다.


ssh나 rsh을 이용하는 경우

이 방법은 암호 인증 방식에 비해 설정이 간단하고, 별도의 포트를 열 필요가 없다는 장점이 있습니다. 개발자들이 모두 계정을 갖고 있으므로 저장소가 위치한 디렉토리에 읽기 및 쓰기 권한을 주기만 하면 됩니다. 그렇게 하려면 우선 개발자들을 모두 같은 그룹(예: cvs)의 구성원으로 만듭니다. 이는 시스템 별로 존재하는 그룹 관리도구를 이용하거나 groupadd와 같은 명령으로 cvs라는 그룹을 만들고, 그룹 관리 도구를 쓰거나 /etc/group 파일을 직접 수정하여 개발자들을 그 그룹에 추가하면 됩니다.

예를 들어 minskim과 sehkone이라는 사용자를 cvs 그룹에 추가한다면 다음과 같은 줄이 /etc/group에 생길 것입니다.


cvs:*:510:minskim,sehkone


이제 다음 명령으로 디렉토리의 권한을 열어 줍니다.


# chgrp -R cvs /home/cvs # chmod ug+rwx /home/cvs /home/cvs/CVSROOT


3. 계정이 없는 경우


개발자들이 시스템에 계정을 갖고 있지 않다면 CVS의 암호 인증 방식을 이용해서 CVS 서버에 접속 할 수 있습니다. 각각의 개발자들은 CVS 계정(시스템 계정과는 다름.)을 부여받고, inetd를 통해 정해진 포트로 CVS를 사용할 수 있습니다. 설정은 조금 복잡하지만 개발자들에게 일일이 시스템 계정을 발급할 필요가 없으므로 시스템 관리 측면에서는 보다 낳은 방법이라 할 수 있습니다. 특히 불특정 다수에 대해 CVS로 파일을 받아갈 수 있도록 해야 하는 공개 프로젝트의 경우 대부분이 이 방식을 채택하고 있습니다. 아파치나 모질라 같은 경우가 대표적인 예가 될 것입니다. 반면 개발자들이 시스템 계정을 갖고 있는 경우라도 ssh이나 rsh을 통한 접속을 허용하고 싶지 않을 경우는 별도의 CVS 계정을 만들어 암호 인증 방식을 이용할 수도 있습니다.


inetd로 CVS 접속을 허용하는 방법은 우선 CVS가 사용하는 포트 번호(2401번)를 등록해야 합니다. /etc/services에 다음과 같은 줄이 있는지 확인합니다.


cvspserver 2401/tcp


만일 없다면 위의 내용을 추가합니다. 다음은 실제로 해당 포트를 열어줄 차례인데, 이는 시스템이 inetd를 쓰고 있는지, xinetd를 쓰고 있는지에 따라 설정 방법이 다릅니다. 먼저 inetd의 경우는 /etc/inetd.conf에 다음 내용을 추가합니다.


cvspserver stream tcp nowait root /usr/bin/cvs cvs --allow-root=/home/cvs pserver


 만약 tcpd를 사용한다면 위의 줄 대신 다음을 추가합니다.


cvspserver stream tcp nowait root /usr/sbin/tcpd /usr/bin/cvs --allow-root=/home/cvs pserver (한 줄로 씀)


물론 /usr/bin/cvs/usr/sbin/tcpd는 실제로 이들 명령이 위치하는 절대 경로를 써 주어야 합니다.


새로운 설정 내용을 반영하려면 inetd를 재시작하고, inetd의 프로세스 ID가 357이라면 다음과 같이 HUP 신호를 보냅니다.

# kill -HUP 357


xinetd를 쓴다면 /etc/xinetd.dcvspserver란 이름으로 별도의 파일을 만들어야하고, 파일 내용은 다음과 같습니다.


# default: on # description: The cvspsever serves CVS Passowrd Server sessions; it uses # unencrypted username/password pairs for authentication. service cvspserver { disable = no flags = REUSE socket_type = stream wait = no user = root server = /usr/bin/cvs server_args = --allow-root=/home/cvs pserver log_on_failure += USERID }

inetd의 경우와 마찬가지로 /usr/bin/cvscvs 명령의 절대 경로, /home/cvs는 저장소의 위치로 바꿔 줍니다.

xinetd를 재시작하는 방법도 inetd와 동일합니다. 우선 xinetd의 프로세스 ID(357이라 가정합니다)를 알아낸 후, HUP 신호를 보내봅니다.


# kill -HUP 357


이제 접속 포트는 열어두었으니, 개발자들에게 CVS 계정을 발급하는 일만 남았습니다. 암호 인증 방식을 이용하는 경우, 계정과 암호는 저장소의 CVSROOT 디렉토리 밑에 passwd란 이름의 파일에 저장됩니다. 여기에서는 /home/cvs/CVSROOT/passwd가 될 것입니다. 하지만 이 파일은 처음에는 존재하지 않습니다. 그러므로 직접 만들어주어야 합니다.

예를 들어 보겠습니다.

minskim:YxNPCzaM/WCp2:cvs

sehkone:Yw2najHG5cLfo:cvs

각 줄은 한 사용자에 대한 정보를 담고 있습니다. 줄은 ':'을 경계로 다시 세 부분으로 나뉘는데 첫 부분이 사용자의CVS 계정 이름(시스템 계정과는 다름), 그 다음은 암호, 그리고 마지막은 시스템 계정 이름입니다. 즉, 이 파일에는 현재minskim과 sehkone이라는 두 사용자가 등록되어 있고, 이들이 CVS 이용 시에는 cvs란 시스템 계정의 권한을 갖는 것입니다. 암호부분은 유닉스 시스템에서 전통적으로 사용되는 crypt 함수를 이용하여 변환된 값이 저장되어 있습니다. 새로운 사용자를 추가하려면 같은 형식으로 한 줄을 추가해 줍니다.

마지막으로 필요한 것은 cvs란 시스템 계정에 저장소에 대한 읽기 및 쓰기 권한을 주는 것입니다. 앞 절과 일관성을 유지하려면 cvs란 그룹을 만들고 cvs란 사용자를 cvs 그룹에 추가한 후, cvs 그룹에 대한 권한을 다음과 같은 방법으로 열어 줍니다.


# chgrp -R cvs /home/cvs # chmod ug+rwx /home/cvs /home/cvs/CVSROOT


4. 기본적인 사용 방법


저장소가 초기화되어 있고 사용할 수 있는 권한이 있다면 cvs명령을 이용해서 바로 프로젝트를 시작할 수 있습니다. 

CVS는 대부분의 Linux 배포본에 포함되어 있으므로 Linux를 사용하고 있다면 이미 CVS가 설치 되어 있을 것입니다. 만일 CVS 명령이 없다면 http://www.cvshome.org/에서 적당한 파일을 받아 설치하십시오.


cvs 명령의 기본 형식은 다음과 같습니다.


$ cvs [cvs 옵션] 명령 [명령 옵션과 인자]

명령 부분에는 실제로 cvs에게 지시할 명령이 오게 되며, 각 명령마다 요구하는 인자가 있을 수 있습니다.


cvs에 login하기

$ cvs -d [ 쿼리] login

쿼리 예제)

:pserver:ssangbuja@open.ssu.ac.kr:/home/cvs


5. 저장소 이용


모든 CVS 명령은 저장소의 위치를 알아야 수행될 수 있습니다. 앞에서 본 저장소 초기화의 예에서도 init 명령을 사용하면서 -d 옵션으로 저장소의 위치를 알려 주고 있습니다. CVS의 다른 명령들도 같은 옵션으로 저장소의 위치를 지정할 수 있습니다. 또 다른 방법은 CVSROOT라는 환경변수의 값으로 저장소의 위치를 주는 것입니다. 예를 들어 저장소의 위치가 /home/cvs인 경우, sh이나 bash를 쓴다면 다음의 내용을 초기화 파일(.bash-profile 등)에 넣어 놓으면 편리할 것입니다.


CVSROOT=/home/cvs export CVSROOT


csh이나 tcsh을 쓴다면 다음과 같이 한다.


setenv CVSROOT /home/cvs


이렇게 설정을 하고 나면 -d 옵션과 저장소의 위치를 매번 줄 필요 없이 바로 cvs 뒤에 원하는 명령을 주면 됩니다.

개발자가 CVS 명령을 이용하려 하는 경우 고려해야 할 사항이 하나 더 있습니다. 개발자가 어떤 방식으로 저장소가 위치 한 기계에 연결하는가 하는 것이다. CVS는 다양한 연결 방식을 지원하는데, 여기에서는 주로 사용되는 세 가지 방식에 대해 저장소의위치를 지정하는 방법을 알아보도록 하자. 이하의 예에서는 편의상 -d 옵션으로 저장소의 위치를 지정하겠다. 물론 -d 옵션은 항상 CVSROOT 환경변수로 대치하는 것이 가능하다.


6. 초기화

처음 시작하는 프로젝트를 CVS로 관리하려 한다면 먼저 디렉토리 구조를 잘 설계해야 합니다. 먼저 할 일은 프로젝트의 이름을 정하는 것입니다. 이 이름은 저장소에서 이 프로젝트 관련 파일들을 저장하는 디렉토리의 이름으로 쓰입니다.

proj란 이름의 프로젝트 디렉토리가 다음과 같이 되어 있다고 가정해봅니다.


$ cd proj $ ls Hello.java README


저장소에 새 프로젝트를 만들고 이 두 파일을 저장하기 위해서는 import 명령을 사용합니다. import 명령의 사용법은 다음과 같습니다.

$ cvs import -m "메시지" 프로젝트이름 vender_tag release_tag


'메시지'는 프로젝트를 시작하면서 저장소에 기록하고 싶은 내용을 적어주면 됩니다. CVS는 파일을 저장할 때마다 메시지를 적도록 하고 있습니다. 이 내용을 원하는 때에 다시 볼 수 있으므로 개발자가 어떤 작업을 했는지를 적어 놓으면 다른 개발자들이 파일의 변경 내용, 작업 진척 상황 등을 파악하는데 도움을 줄 수 있습니다. 뒤의 두 태그는 지금 단계에서는 별 의미가 없으므로 적당한 말을 써 주면 된다. proj란 프로젝트를 저장소에 만들기 위해서는 다음 명령을 사용합니다.

$ cvs import -m "프로젝트 시작" proj webdox start N proj/Hello.java N proj/README No conflicts created by this import

앞에 말했듯이 뒤의 두 단어는 별 의미가 없으므로 크게 신경 쓰지 마시고, 이 명령을 실행하면 CVS는 저장소에 proj란 디렉토리를 만들고, 거기에 READMEHello.java를 저장하는 것입니다. 이 외에도 옵션으로 준 메시지와 각 파일의 부가적인 정보를 기록하게 됩니다. 출력되는 메시지를 보면 각 파일 이름 앞에N이란 글자가 있는 것을 알 수 있습니다. CVS는 특정 명령 수행 시에 파일별로 수행 결과를 나타냅니다. N은 새로운 파일이 추가된것을 의미합니다. 마지막 줄에서 conflict란 현재 디렉토리에 있는 파일을 저장소에 저장하게 되면 어떤 이유로 이미 저장소에 있는 파일과 충돌을 일으키는 경우를 뜻합니다. 다른 사람이 작업해서 저장소에 저장해 놓은 것을 덮어쓰려 한다거나 하는 경우입니다. 여기에서는 저장소에 아무 파일도 없으므로 충돌(conflict)이 생기지 않습니다.

import 명령으로 프로젝트를 초기화하고 나면 더 이상 현재 디렉토리에 갖고 있는 것들을 사용하면 안 됩니다. 현재 디렉토리에는 CVS에 관련된 정보가 아무 것도 없기 때문입니다. 대신 저장소에 모든 내용이 들어 있으므로 proj 디렉토리 자체를 완전히 지워버려도 괜찮습니다.


7. 작업 공간 생성 (checkout)


작업을 시작하기 위해서는 파일을 마음대로 변경하고 저장하여 테스트해 볼 수 있는 작업 공간이 필요합니다. 저장소에 있는 파일들을 불러와 나만의 작업 공간을 만드는 명령이 checkout입니다. 앞에서 만든 proj를 checkout 명령으로 불러 오려면

 

$ cvs checkout proj cvs checkout: Updating proj U proj/Hello.java U proj/README

checkout 대신 co만 써 주어도 됩니다. 앞에 붙은 U는 파일이 갱신(update)되었음을 의미하고, 명령을 수행하고 나면 현재 디렉토리에 proj란 디렉토리가 생깁니다. 이 디렉토리가 바로 작업 공간입니다. 디렉토리 안에는 프로젝트를 초기화할 때 있던 파일들이 그대로 들어 있는 것을 볼 수 있습니다. 이 디렉토리에 CVS가 파일들을 관리하는데 필요한 정보가 기록됩니다.


8. 작업 내용의 저장 (commit)


파일을 만들었으면 저장을 해야 합니다.

$ cvs commit -m " 메세지"  파일명

ex)

$ cvs commit -m " 방명록 추가"  guest.jsp


어떤 명령인지 쉽게 이해할 수 있을 것이다. -m은 앞의 예와 마찬가지로 메시지를 의미합니다. guest.jsp 파일은 ‘방명록 추가’ 이라는 메시지와 함께 저장소에 저장이 됩니다.

맨 끝의 파일 이름은 생략할 수 있습니다. 파일 이름을 주지 않으면 CVS가 변경된 파일을 모두 찾아 저장소에 저장합니다. 이때 저장되는 모든 파일에 같은 메시지가 붙습니다. 하지만 파일마다 다른 메시지를 붙이고 싶다거나 특정 파일의 변경 내용만을 저장하고 싶다면 위의 예처럼 파일 이름을 명시해 주어야 합니다.


9. 저장소의 파일 받아오기 (update)


작업공간에 저장소 보다 낮은 버전의 파일이 있을 때에 저장소로부터 높은 버전의 파일을 받아와야 합니다. 모든 파일을 다시 새로 받아오기에는 시간이 상당히 걸 릴수 있으므로

update 명령을 사용하여 CVS에 저장된 파일들 중 내가 받아온 이후로 변경된 것들만을 다시 받아 올 수 있습니다.

$ cvs update cvs update: Updating

파일들의 변경이 없다면 위와 같이 별다른 출력 없이 끝날 것입니다. 하지만 만약 변경이 되었다면 다음과 같이 출력될 것입니다.

$ cvs update cvs update: Updating . M 파일명

M은 파일이 변경된(modified) 상태임을 의미합니다.


10. 충돌의 해결


비록 CVS가 두 개발자의 작업 내용을 합쳐 주기는 하지만 여기에도 한계는 있습니다. 만일 2명의 개발자가 동일한 버전의 파일을 가지고 같은 부분을 수정한다면 CVS는 누구의 변경 내용을 택해야 하는지 알 수 없습니다. 경우 이런 경우를 충돌(conflict)이라 하며, CVS는 이 사실을 개발자에게 알려 개발자가 적절한 조치를 취할 수 있도록 합니다.

<<<<<<<<<<<<<<<<       충돌부분        >>>>>>>>>>>>>>>>>>>


=================== 로 충돌 부분을 구별해 줍니다.


11. 파일의 추가/삭제 (add/delete)


작업을 하다 보면 새로운 파일을 만들거나 기존의 파일을 지워야 할 경우가 생깁니다. 이런 경우에 사용하는 명령이 adddelete입니다. 사용 방법은 매우 간단합니다. Test.java란 파일을 새로 만들려면 먼저 현재 디렉토리에 Test.java를 생성한 후 다음과 같이 하면 된다.

$ cvs add 추가될 파일명

저장소에 파일을 추가합니다. add 명령은 단지 commit 명령시에 추가한 파일명을 추가해야 한다는 것을 기록해 놓을 뿐입니다. 이 사실은 update로 확인해 볼 수도 있습니다.

$ cvs update cvs update: Updating . A 추가될 파일명

앞의 A는 추가될(added) 파일임을 의미합니다. 그러므로 추가될 파일은 나중에 작업 내용 전체를 commit할 때 저장소에 추가될 것입니다

$ cvs commit -m "새 파일" 추가될 파일명 RCS file: /home/cvs/proj/추가될 파일명,v done Checking in 추가될 파일명;


파일을 삭제할 경우에는 먼저 파일을 작업 공간에서 삭제하여야 합니다.

$ cvs delete 삭제될 파일명

그 후 update로 확인을 해보면 다음과 같습니다.

$ cvs update cvs update: Updating . R 삭제될 파일명

commit 명령을 사용하면 저장소에서 삭제됩니다.

$ cvs commmit -m "삭제" 삭제될 파일명 Removing 삭제될 파일명;



출처 : http://www.oss.or.kr/

'OS' 카테고리의 다른 글

공공기관, 회사에서 네이트온 이용하기  (1) 2007.07.30
CVS의 사용법 part 2/2  (0) 2007.07.14
Geforce 오버 클럭킹  (0) 2007.03.09
시더밀 356 오버클럭 4.0GHz  (0) 2007.03.01
FAT vs NTFS  (0) 2007.02.28

+ Recent posts