300 likes | 464 Views
2004 Fall. RCS 와 CVS 로 소스 관리. 주 홍 택 컴퓨터공학과 계명대학교. 2004 Fall. RCS. 주 홍 택 컴퓨터공학과 계명대학교. 도입. 소프트웨어는 공동작업을 통하여 개발이 되고 발전하며 새로운 용도로 이용되기도 함 RCS(Revision Control System: 버전 관리 시스템 ) 은 유닉스에서 프로그램 개발을 돕는 소스 관리 도구임 대형 프로젝트 수행 시 반드시 필요한 도구임 여러 개발자가 프로젝트 수행 시 도움을 줌 소스 이력 관리 동시에 소스 수정을 방지함
E N D
2004 Fall RCS와 CVS로 소스 관리 주 홍 택 컴퓨터공학과 계명대학교
2004 Fall RCS 주 홍 택 컴퓨터공학과 계명대학교
도입 • 소프트웨어는 공동작업을 통하여 개발이 되고 발전하며 새로운 용도로 이용되기도 함 • RCS(Revision Control System:버전 관리 시스템)은 유닉스에서 프로그램 개발을 돕는 소스 관리 도구임 • 대형 프로젝트 수행 시 반드시 필요한 도구임 • 여러 개발자가 프로젝트 수행 시 도움을 줌 • 소스 이력 관리 • 동시에 소스 수정을 방지함 • 다른 방향으로 진행된 개발 결과를 합칠 수 있음 • 변경 내용을 추적할 수 있음 • 자동으로 생성되는 것은 관리하지 않음
버전 트리 • 하나의 파일을 트리 구조로 버전을 관리함 • 각 버전은 버전 번호를 가짐 • Release Revision branch • 새로운 분기점 가능 • 새로운 시도, 새로운 시스템에 포팅등 • 두개의 버전을 통합하기 위하여 rcsmerge를 사용함 root(1.1) trunk(1.2) trunk(1.3) branch(1.3.1.1) trunk(1.4) branch(1.3.1.2) tip(1.5) tip(1.3.1.3)
기본적인 동작: ci , co Check out Sources Check in Check out Check out Check in Check in
기본적인 동작: ci (Check in) • 소스 파일 관리를 시작하거나 새로운 버전을 만듬 • 원래의 소스 파일을 지우고 버전 관리를 위한 새로운 파일을 생성함 • 예: source.c source.c,v • 수정을 위하여는 추후에 co 명령어를 사용함 • 이력 관리를 위하여 설명문을 입력함 • check in을 소스에 대한 잠금 해제(release lock)로 해석되기도 함 • 이후 부터 다른 사람도 소스를 수정할 수 있음 • 수정 내용 없이 check in 하면 소스 파일만 지우는 효과를 가져 옴
기본적인 동작: co (Check out) • 소스 파일 사용하기 위하여 가져옴 • 기본적으로 가장 최근의 파일을 가져옴 • source.c,v source.c • check out을 소스에 대한 잠금 설정(set lock)로 해석되기도 함 • 이후에는 다른 사람은 수정을 위한 check out을 수행할 수 없음 • 파일을 수정하기 위한 것과 파일을 읽기 용도를 분명히 구분할 것 • 누가 특정 파일을 check out 했는지 알아 볼 수 있음
RCS 디렉토리와 파일 • Check in과 check out을 실행하기 전에 항상 RCS라는 디렉토리가 존재하는지 확인을 함. • 만약 존재한다면 이 디렉토리를 파일을 보관하기 위한 용도로 사용함 • RCS는 파일 별로 관리를 위한 rcs 파일을 생성(확장자 ,v)를 붙임 • rcs 파일은 파일 내용과 함께 파일에 대한 세부 사항, 전체 경로, 현재 버전, 접근할 수 있는 사용자 리스트, 파일의 시간과 날자에 관한 정보를 보관 • 버전이 증가함에 따라서 파일의 크기가 커짐 • 필요에 따라서 특정 버전을 삭제할 수 있음 • rcs –orange filename • 특정 버전을 삭제하여도 버전 번호는 유지됨
버전로그 • rlog
문자 식별 • 소스 파일에 특정 문자열(마커)을 삽입하면 RCS는 이 문자열에 소스 관리에 대한 정보를 추가함 • 예 $Header$ $Header : /Home/juht/temp/test, v 1.3 2003/11/16 03:28:30 juht Exp $ • 일반적으로 마커는 소스의 주석 안에 놓음 • 특정 변수에 저장할 수도 있음 • 프로그램 실행시 소스 버전 출력 가능 • 컴파일된 오브젝트 코드에서 소스 버전 확인 가능(ident) • 그외 유용한 마커: $Author$, $Date$, $Locker$, $Revision$, $Source$, $State$
파일 잠금 모드 • Strict Access 모드 • 기본적인 소스 잠금 모드 임 • 모든 개발자는 소스 파일을 check out 한 후에 수정할 수 있음 • 다른 사람이 check out한 소스 파일을 수정을 할 수 없음 • Open Access 모드 • rcs –U filename 과 rcs –L filename으로 Strict Access 모드에서 빠져 나오거나 다시 돌아 갈 수 있음 • 이 모드에서는 파일의 소유자만 수정을 위한 check out 없이 rcs 파일 수정이 가능함 • co 명령시 –l 옵션을 사용하지 않음 • 두 사람이 동시에 파일을 수정할 수 있음
Check in에 대하여 • Check in을 실패하는 경우 두가지 • Strict Access 방식에서 check out 할 때 파일에 잠금을 설정하지 않고 소스를 수정함 • Open Access 방식에서 소유자 이외의 다른 개발자가 소스 파일에 잠금을 설정한 경우 • 다른 개발자가 잠금을 설정하지 않은 경우이면 파일의 잠금을 실행할 수 있음 rcs –l filename • 이미 다른 개발자가 잠금을 설정한 경우이면 • 이전 버전에 대하여 잠금을 실행하고 이후에 합치는 작업을 실시함 • 잠금을 실행한 다른 개발자와 협상을 실시함 • Check in과 check out를 연속적으로 실행할 수 있음 ci –l filename
버전 번호와 이름 관리 • Check in시 –r 옵션을 사용하여 새로운 버전 번호를 할당 할 수 있음 • 많은 발전을 하여 새로운 Release를 만드는 경우등 • Check out시에도 –r 옵션을 사용하여 오래된 버전을 가져 올 수 있음 • 다양한 이유가 존재함 • 특정 버전에 버전 번호 대신에 버전 이름을 사용할 수 있음 • rcs –nname:revision filename • ci –nrevision filename • 하나의 버전에 여러 개 이름 설정 가능
접근 리스트(Access Control List) • rcs 소스 파일에 대한 권한 • 파일의 소유자는 자신의 파일을 항상 읽을 수 있고 수정 가능 • 슈퍼 유저는 모든 파일을 읽고 쓸 수 있음 • 접근 리스트에 아무도 없으면 누구나 파일을 읽고 쓸 수 있음 • 접근 리스트가 비어 있지 않으면 리스트에 있은 개자만 파일에 대하여 잠금을 설정할 수 있음 • Rcs 명령의 –a 명령어를 사용하여 접근 리스트에 개발자를 추가하고 –e로 삭제할 수 있음
2004 Fall CVS 주 홍 택 컴퓨터공학과 계명대학교
도입 • 각종 파일의 버젼을 쉽게 관리할 수 있도록 도와주는 도구임 • 소프트웨어 개발 단계 별로 소스를 저장할 수 있음 • 개발이 진행된 후 예전 버전을 다시 볼 수 있음 • 작업한 내용을 글로 적어 함께 저장 • 각 버전 별로 소스의 변경 내용만 저장함: 공간 절약 • 여러 개발자가 하나의 프로젝트를 진행하는데 유용함 • 수정 예약 방식을 사용하지 않음 잠금 설정 없음 • 여러 개발자가 같은 파일을 동시에 수정할 수 있음 • 서로 다른 부분을 고치면 쉽게 합칠 수 있는 방법 제공 • 같은 부분을 고치면 수정한 사람들이 협상하여 함 • 대다수의 공개 프로젝트에서 사용되어 그 효능을 입증하였음 • Unix 환경은 물론, Windows나 Macintosh에서도 사용
동작 방식 • 저장소 • 공동으로 작업하는 파일 및 버전에 관한 정보를 중앙에서 보관하는 장소 • 디렉토리에 전반적인 설정 사항과 각 프로젝트의 파일들(문서, 프로그램 등)은 물론, 각 파일의 버젼 관리에 필요한 정보, 파일별 작업 기록들을 저장 • 프로젝트 • 여러 개의 프로젝트가 하나의 저장소를 공유할 수 있음 • 시작시 파일 및 기본 디렉토리 구조를 자신의 작업 디렉토리에 만들고, 이를 저장소로 옮김 • 프로젝트 진행 • 저장소에 있는 내용을 복사하여 자신의 작업 디렉토리를 만듬 • 작업 결과를 저장소로 옮기고, 다른 사람이 저장소에 올려 놓은 작업 결과를 받아오는 오면서 자신의 디렉토리에서 소프트웨어 개발을 실시함
CVS 저장소 설정: CVS 서버 설치 • 저장소를 이용할 프로젝트들의 규모를 고려하여 충분한 공간 마련 • 저장소를 /home/cvs에 만들기로 했다면 다음과 같이 초기화할 수 있음 # cvs -d /home/cvs init • -d는 저장소의 위치 • init가 CVS 명령 • CVSROOT 디렉토리가 생성됨 • CVS의 각종 설정 내용을 담고 있는 디렉토리임 • CVS를 이용할 개발자들에게 저장소를 사용할 수 있는 권한을 부여
명령어 기본 • 기본 명령어 형식 $ cvs [cvs 옵션] 명령 [명령 옵션과 인자] • 모든 CVS 명령은 저장소의 위치를 알아야 수행됨 • 환경변수 CVSROOT 의 값으로 저장소의 위치 지정 • 또는 명령어 마다 –d 옵션 사용 • 시스템 인증 또는 CVS 서버 인증 과정이 모든 명령어 사용에 앞서 이루어져야 함 cvs -d :pserver:minskim@cvs.webdox.or.kr:/home/cvs login
프로젝트 생성 • 프로젝트의 이름을 결정 • 저장소에 새 프로젝트를 만들고 이 두 파일을 저장하기 위해서는 import 명령을 사용한다 • $ cvs import -m “msg" pname vender_tag release_tag • msg: 프로젝트 시작에 관한 메시지 • pname: 프로젝트 이름(디렉토리) • vender_tag: 일반적으로 프로젝트 생성자의 이름 • Release_tag: 프로젝트 생성시의 상태 • pname에 있는 모든 파일들이 CVS 저장소로 이동됨 • 이후에는 저장소에 저장된 것을 사용해야 함
프로젝트 시작 • 프로젝트에 참여해서 작업하려면 먼저 프로젝트 디렉토리명 (또는 모듈명) 을 알아야 함 • 작업할 프로젝트 디렉토리를 정했으면 cvs checkout 명령으로 저장소의 내용을 자신의 작업환경에 가져옴 cvs checkout directoryname • CVSROOT 도 다른 디렉토리와 마찬가지로 취급됨
소스 편집 • 보통 파일 편집하는 것과 다른 점이 없음 • 파일에 다음과 같은 RCS 지정자(마커)를 삽입하여 최근 수정일, 고친 사람, 개정판 번호 등의 정보를 알기 쉽게 함 • $Id$ • $Date$ • $Revision$ • $Log$
파일 추가 • 파일 이나 디렉토리 모두 동일한 방법으로 아래와 같이 CVS 저장소에 추가 bash$ mkdir newdir bash$ cvs add newdir bash$ cd newdir bash$ vi newfile.c bash$ cvs add newfiles.c bash$ cp ~/somewhere/img/test.gif . bash$ cvs add -kb test.gif bash$ cd .. bash$ cvs commit • 단, cvs commit 명령을 수행하기 전까지는 실제로 CVS 저장소에 저장되지 않음 • 문서가 아닌 이미지 같은 바이너리 파일 도 추가해서 CVS 저장소에 넣을 수 있는데 이때에는 반드시 -kb 옵션을 주어야 한다.
삭제 • 불필요한 파일 이나 디렉토리 를 CVS 저장소에서 삭제할 수 있음 bash$ rm newfile.c bash$ cvs remove newfile.c bash$ cvs commit • 추가와 마찬가지로 cvs commit 명령을 수행하기 전까지는 실제로 CVS 저장소에서 삭제하지 않음
충돌 해결 방법 • 개발자들 간에 update 하고 commit 하는 시간차이가 있어 변경된 내용이 서로 일치하지 않으면 commit 할때 충돌 (conflict) 이 일어남 • 충돌이 일어나면 해당 파일을 편집기로 열어 >>>>>>>> 부터 <<<<<<<< 사이의 충돌나는 부분을 편집한 후 다시 commit 을 시도 하면 됨. • 동일한 부분을 수정했으면 협상이 필요함
Snapshot 생성 • 어느 한 시점에서의 프로젝트 파일들에 동일한 꼬리표 (TAG) 을 붙일 수 있음 bash$ cvs commit bash$ cvs tag REL_1_0 • 이것은 각각의 파일 들의 개정판 번호가 시간이 흐를수록 제각기 되기 때문에 특정 시점의 파일 들을 항상 동일하게 꺼낼 수 있게 해줌 • 예를 들어 A 라는 프로그램이 a.c, b.c, c.c 라는 소스 파일로 구성되어 있을때 현재의 파일 들에게 REL_1_0 이라는 꼬리표를 붙임 • REL_1_0 꼬리표를 사용해서 CVS 저장소로부터 꺼낸다. bash$ cvs co -rREL_1_0 prog_a bash$ cd prog_a
Resources • Homepage and FAQ • http://www.cvshome.org • “Open Source Development with CVS” • 2nd Edition, ISBN: 1-58880-173-X • http://www.coriolis.com • Available online at http://library.books24x7.com • http://database.sarang.net/study/cvs/cvs-han/cvs-guide.html