강좌
클라우드/리눅스에 관한 강좌입니다.
리눅스 분류

버전 관리 시스템 - Concurrent Versions System (CVS)-2

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

버전 관리 시스템 - Concurrent Versions System (CVS)-2



목차

CVS 따라하기

리눅스환경에서 CVS 사용법

     가. 저장소설정

     나. 프로젝트 초기화

     다. 프로젝트 진행

         ­ 파일을 체크아웃하기

         ­ 최신정보로 유지하기

         ­ 파일과 디렉토리 추가하기

         ­ 파일과 디렉토리 삭제

         ­ 파일,디렉토리 이름변경

         ­ 변경내용살펴보기

         ­ 버전간의 차이점보기

         ­ 패치화일 작성으로 오픈소스 개발에 참여하는법

         ­ 충돌해결

         ­ 변경내용전송

         ­ 변경기록조사

         ­ 변경한내용을 제거하기

참고 & 도서



CVS 따라하기


이 장은 CVS를 이용해서 새로운 프로젝트를 생성하고, 수정내용을 저장소에 저장하는 과정을

스크린샷으로 따라할수 있도록 보여준다.

누구나 화면을 따라 하기만 하면 CVS를 사용할수 있다.


리눅스환경에서 CVS 사용법


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

CVS를 이용하는 모든 과정은 cvs 명령을 통해 이루어진다. cvs 명령의 기본 형식은 다음과 같다.

 

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


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

 

1. 저장소설정

 

 

저장소에는 앞으로 변경될 파일및 데이터를 저장할수있는 충분한 공간이 있어야한다. 어림잡아서 최종모듈의 3배정도되는 파티션에 저장소를 만들고, 스카티원칙(정확한예측이어려운경우 통상2배를 적용)을 적용해서 예상되는 용량의 2배정도를 고려한다. 바이너리 파일을 저장하고자 한다면 여기에 10을곱한 정도의 용량을 생각해야한다


데비안에서는 makerepos 라는 스크립트가 있으며, man cvsconfig 를 통해서 데비안CVS저장소 자동설정에 대한 설명을 볼수있다. 일반적으로 저장소가 /home/cvs 에 만들기로 했다면 다음과 같이 초기화할 수 있다  여기에 여러 프로젝트가 담기게된다.

1.1.1.1. # cvs -d /home/cvs init

여기서 -d는 저장소의 위치를 나타내며, 마지막의 init가 CVS 명령이다.

물론 이 명령을 사용하기 위해서는 /home에 쓰기 권한을 갖고 있어야 한다.

그러므로 대개의 경우 저장소의 초기화는 root 권한을 가진 씨스템 관리자가 하게 된다.

명령이 실행되고 나면 /home에 CVS란 디렉토리가 생기고, 그 안에는 CVSROOT란 디렉토리가 있을 것이다.

이 CVSROOT 디렉토리는 CVS의 각종 설정 내용을 담고 있는 디렉토리이다.

저장소(/home/cvs)의 파일들을 직접 건드리는 것은 절대로 피해야 한다.

이 파일들을 변경하고 싶다면 cvs 명령을 이용해야 한다.

 

모든 CVS 명령은 저장소의 위치를 알아야 수행될 수 있다. 매번 명령을 내릴때마다 -d 옵션으로 저장소의 위치를 알려주는 방법도 있지만 계속해서 긴 명령어를 타이핑할사람은 없으리라 본다. CVSROOT라는 환경변수의 값으로 저장소의 위치를 주면 이후로는 다시 입력할 필요가 없다.

예를 들어 저장소의 위치가 /home/cvs인 경우, sh이나 bash를 쓴다면 다음의 내용을 초기화 파일(.bash-profile 등)에 넣어 놓으면 편리할 것이다.
 

1.1.1.1. CVSROOT=/home/cvs

1.1.1.2. export CVSROOT

 

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

 

1.1.1.3. setenv CVSROOT /home/cvs

 

이렇게 설정을 하고 나면 -d 옵션과 저장소의 위치를 매번 줄 필요 없이

바로 cvs 뒤에 원하는 명령을 주면 된다.

개발자가 CVS 명령을 이용하려 하는 경우 고려해야 할 사항이 하나 더 있다.

개발자가 어떤 방식으로 저장소가 위치한 기계에 연결하는가 하는 것이다.

CVS는 다양한 연결 방식을 지원하는데, 여기에서는 주로 사용되는 세 가지 방식에 대해 저장소의 위치를 지정하는 방법을 알아보도록 하자. 이하의 예에서는 편의상 -d 옵션으로 저장소의 위치를 지정하겠다. 물론 -d 옵션은 항상 CVSROOT 환경변수로 대치하는 것이 가능하다.


저장소와 개발자가 같은 기계를 쓸 경우


앞에서 저장소를 초기화한 것과 같은 경우이다. 같은 기계를 쓰기 때문에 저장소가 있는 디렉토리 이름을 주는 것으로 충분하다. 앞에서 만든 저장소에 CVS 명령을 내리려면 다음과 같이 한다.

1.1.1.4. $ cvs -d /home/cvs 명령


개발자가 ssh이나 rsh을 이용하는 경우


ssh이나 rsh을 쓸 수 있다면 저장소 위치에 다음과 같이 계정과 기계 이름을 포함시켜서 CVS 명령을 사용할 수 있다.

 

1.1.1.5. $ cvs -d :ext:chaeya@210.183.235.13:/home/cvs 명령

 


여기서 :ext:가 ssh이나 rsh을 이용한 접속 방식임을 나타내는 구실을 한다.

다만 기본적으로 cvs는 :ext:로 시작하는 저장소의 경우 rsh을 이용하므로,

ssh을 쓰려면 CVS_RSH이라는 환경변수를 ssh로 설정해 주어야 한다.


1.1.1.6. export CVS_RSH=ssh


물론 ssh 외에도 rsh과 같은 방식으로 동작하는 다른 명령이 있다면 그 명령을 사용할 수도 있다.


암호 인증 방식 이용


암호 인증 방식은 앞의 두 방식과는 달리 CVS 명령을 사용하기에 앞서 로그인을 해야 한다.

CVS로 파일을 제공하는 공개 프로젝트들의 경우 홈페이지에서 'CVSROOT를 ...로 설정하십시오' 라는 문구를 볼 수 있을 것이다. 이것이 바로 암호 인증 방식의 저장소 위치이다.

210.183.235.13 이란 기계의 /cvsroot 에 저장소가 위치하고 chaeya 란 CVS 계정이 만들어져 있다면 다음과 같이 로그인할 수 있다.

 

$ cvs -d :pserver:chaeya@210.183.235.13:/cvsroot login

 

 


그러면 암호를 물어오는데 암호는 CVSROOT/passwd에 CVS 계정을 추가할 때 사용한 것과 같다. 저장소 위치의 :ext:만 :pserver:로 바뀌었을 뿐, 형식은 ssh을 이용하는 경우와 동일함을 알 수 있다.

일단 로그인을 하고 나면 인증 정보가 .cvspass란 파일에 아래와같은 내용이 저장이 된다

1.1.1.7. /1 :pserver:chaeya@210.183.235.13:2401/cvsroot AecZ%Edca


이후로는 암호 없이 CVS 명령을 이용할 수 있다. 물론 CVSROOT 를 이미 설정해 두었다면 저장소의 경로는 적지않아도 되므로 훨씬 간단해진다.

1.1.1.8. $ cvs -d :pserver:chaeya@210.183.235.13:2401/cvsroot 명령

1.1.1.9. $ cvs 명령 //CVSROOT 가 설정되어 있는경우

 

2. 프로젝트 초기화

 

사용 가능한 CVS 저장소가 있고, 어떻게 저장소를 이용하는지 알고 있다면 프로젝트를 시작할 모든 준비가 끝난 셈이다. 더군다나 기존의 프로젝트에 CVS를 도입하려는 경우라면 이미 디렉토리와 파일들이 있을테니 이를 저장소에 저장하는 방법만 배우면 된다. 하지만 처음 시작하는 프로젝트를 CVS로 관리하려 한다면 먼저 디렉토리 구조를 잘 설계해야 한다. 물론 언제라도 CVS를 이용해서 파일의 위치를 옮기고 새로운 디렉토리를 만드는 등의 일은 가능하다. 하지만 처음부터 디렉토리 구조와 각 디렉토리에 들어갈 파일들을 잘 정해 놓는 것은 전체 프로젝트 관리에도 도움을 주므로 되도록이면 나중에 파일이나 디렉토리의 위치 변경이 생기지 않도록 설계를 하고 프로젝트를 시작하도록 하자.

먼저 할 일은 프로젝트의 이름을 정하는 것이다. 이 이름은 저장소에서 이 프로젝트 관련 파일들을 저장하는 디렉토리의 이름으로 쓰인다. 여기에서는 demoproj 란 이름으로 프로젝트를 만들어 보기로 하겠다. 이후에 나올 모든 예는 환경변수 CVSROOT가 아래처럼 설정되어 있다고 가정한다.


1.1.1.1. [chaeya@tsc14 ~/cvswork]

1.1.1.2. $ echo $CVSROOT

1.1.1.3. :pserver:chaeya@210.183.235.13:/cvsroot


demoproj 란 디렉토리가 아래와 같이 되어있다고 가정하자


1.1.1.4. [chaeya@tsc14 ~/cvswork]

1.1.1.5. $ cd demoproj/

1.1.1.6. [chaeya@tsc14 ~/cvswork/demoproj]

1.1.1.7. $ ls

1.1.1.8. sample.txt

1.1.1.9. [chaeya@tsc14 ~/cvswork/demoproj]

1.1.1.10.


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

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

'메시지'는 프로젝트를 시작하면서 저장소에 기록하고 싶은 내용을 적어주면 된다.

CVS는 파일을 저장할 때마다 메시지를 적도록 하고 있다.

이 내용을 원하는 때에 다시 볼 수 있으므로 개발자가 어떤 작업을 했는지를 적어 놓으면 다른 개발자들이 파일의 변경 내용, 작업 진척 상황등을 파악하는데에 도움을 줄 수 있다.

뒤의 두 태그는 지금 단계에서는 별 의미가 없으므로 적당한 말을 써 주면 된다.

프로젝트이름부분은 저장소에 이이름으로 디렉토리가 생기고 그 안에 해당 소스들이 위치 하게

된다. vender_tag 는 project 관리자의 id정도만 넣어 줘도 되며,

release_tag는 최초로 하는 것이니 start 또는 initial 정도로 써준다

demoproj 라는 프로젝트를 저장소에 만들기 위해서는 다음 명령을 사용한다.


1.1.1.12.

1.1.1.13. [chaeya@tsc14 ~/cvswork/demoproj]

1.1.1.14. $ cvs import -m "start demo project" demoproj demoproj initial

1.1.1.15. N demoproj/sample.txt

1.1.1.16.

1.1.1.17. No conflicts created by this import


앞에 말했듯이 뒤의 두 단어는 별 의미가 없으므로 크게 신경쓰지 말기 바란다.

이 명령을 실행하면 CVS는 저장소에 demoproj 라는 디렉토리를 만들고, 거기에 sample.txt 를 저장한다. 이 외에도 옵션으로 준 메시지와 각 파일의 부가적인 정보를 기록하게 된다.

출력되는 메시지를 보면 각 파일 이름 앞에 N이란 글자가 있는 것을 알 수 있다.

CVS는 특정 명령 수행시에 파일별로 수행 결과를 나타낸다.

N은 새로운 파일이 추가된 것을 의미한다.

마지막 줄에서 conflict란 현재 디렉토리에 있는 파일을 저장소에 저장하게 되면 어떤 이유로 이미 저장소에 있는 파일과 충돌을 일으키는 경우를 뜻한다. 다른 사람이 작업해서 저장소에 저장해 놓은 것을 덮어쓰려 한다거나 하는 경우인데, 자세한 것은 뒤에서 conflict가 발생하는 경우를 예로 들어 설명하겠다. 여기에서는 저장소에 아무 파일도 없으므로 충돌(conflict)이 생기지 않는 것이 당연하다.

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

이미 저장소에 저장되었으므로 언제라도 다시 불러올 수가 있다.

프로젝트 초기화는 모두 끝난 것이며, 이후로는 각 개발자들이 CVS를 이용하여 프로젝트를 진행시키는 일만이 남아 있다.

 

3. 프로젝트 진행

 

이제 프로젝트에 참여하는 개발자의 입장에서 프로젝트를 바라보자.

모든 필요한 파일들은 저장소에 갖추어져 있고,

프로젝트 관리자로부터 저장소의 위치와 프로젝트 이름도 통보받았다.

그러면 개발자는 앞으로의 작업을 위해 저장소의 위치를 환경변수 CVSROOT에 저장하고, 작업을 시작하면 된다. 단, CVS는 파일의 변경 시각을 참조하는 경우가 많으므로 각 개발자들이 사용하는 기계의 시간을 서로 맞추어 놓을 필요가 있다.


3-1. 파일을 체크아웃하기

cvs checkout 또는 cvs co 라고 줄여쓰기도 한다

이 명령은 저장소의 일부를 지역작업공간으로 가지고온다

앞에서 만들었던 demoproj 를 가지고 와보자.

cvs로 가지고 온것들을 처리하는 디렉토리를 ~/cvswork 이라고 하나 만들었다.

1.1.1.1. [chaeya@tsc14 ~/cvswork]

1.1.1.2. $ cvs checkout demoproj

1.1.1.3. cvs server: Updating demoproj

1.1.1.4. U demoproj/sample.txt

1.1.1.5. [chaeya@tsc14 ~/cvswork]

1.1.1.6. $ ls

1.1.1.7. demoproj


이제 이안의 화일을 수정한후에 저장소에 전송하면 되는것이다

그럼 디렉토리안의 내용을 한번보자


1.1.1.8. [chaeya@tsc14 ~/cvswork]

1.1.1.9. $ cd demoproj/

1.1.1.10. [chaeya@tsc14 ~/cvswork/demoproj]

1.1.1.11. $ ls

1.1.1.12. CVS  sample.txt


프로젝트를 초기화할 때 있던 파일들이 그대로 들어 있는 것을 볼 수 있다.

하지만 하나 달라진 것이 있다. CVS란 디렉토리가 바로 그것이다.

바로 이 디렉토리에 CVS가 파일들을 관리하는데에 필요한 정보가 기록된다.

예를 들면 각 파일들의 버젼, 최종 수정 시각, 저장소의 위치 등이 이에 속한다.

앞으로 여러 CVS 명령들을 사용하게 되는데, 그때마다 CVS는 이 디렉토리의 정보를 참고하여 각 명령을 수행한다. 하지만 개발자가 이 디렉토리의 내용에 신경쓸 필요는 전혀 없다. 관심이 있다면 살펴보는 것은 좋지만, 내용을 임의로 변경한다거나 해서는 안 된다


3-2. 최신정보로 유지하기

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,157 명
  • 현재 강좌수 :  36,514 개
  • 현재 접속자 :  266 명