이전페이지 다음페이지 차례

4. RCS를 사용해 봅시다. (초급)

이번편은 RCS의 구체적인 예제입니다. 초급 과정을 다루기 때문에 약간 복잡한 요소는 제외시켰습니다. 여기서는 ci, co, rcs 명령어의 예를 들어 전개됩니다.

4.1 기본적인 ci, co의 사용법

이제부터 본격적으로 RCS 명령어를 이용해 보기로 합시다. 그럼 먼저 준비를 해야겠군요. 우선 RCS를 연습할 수 있는 적당한 디렉토리를 하나 만드신 다음에 거기에서 시작합시다. 그리고...

RCS 파일을 저장할 디렉토리를 만듭니다. 이름은 'RCS'. RCS가 고정적으로 쓰는 이름입니다.

% mkdir RCS 

그리고 아래와 같은 간단한 파일을 가지고 시작합니다.

exam.c


/* $Log:$ */

#include <stdio.h>

main()
{
     printf(' Hello \n' );
}

위에서 /* $Log:$ */ 라는 쓴 부분이 보이십니까? 이 부분은 원래는 없어도 됩니다. 하지만 각 버전의 특징을 소스 파일에 기재함으로써 사용자에게 정보를 제공해 주기 때문에 저는 쓰기로 하겠습니다. 참고로 이 부분이 만약 없다고 가정한다면 RCS 파일은 원래 소스 파일에 아무런 표시도 하지 않기 때문에 사용자가 보기엔 어느 버전인지 좀 이해하기 어렵겠죠. $Log:$ 라는 부분은 제가 나중에 설명할 자동 인식표(Auto Identification)의 하나입니다.

그럼 이제 RCS 파일을 만들어 볼까요. 파일을 RCS에 올리는 명령어가 바로 ci(check in)입니다. 처음 버전은 1.1부터 시작합니다.

% ci exam.c 
RCS/exam.c,v <- exam.c
enter description, terminated with single '.' or end of file:
NOTE: This is NOT the log message!
>> This is our First RCS test file
>> .
initial revision: 1.1
done

RCS 에서는 버전 1.1 의 특징을 기록할 수 있도록 메시지를 출력합니다. 저는 그냥 This is our First RCS test file 이라고 기록하겠습니다. 메시지를 마치려면 '.' 을 입력하면 됩니다. 그러면 RCS/exam.c,v 라는 파일이 만들어지죠. 초기 버전은 이미 말씀드린 것과 같이 1.1 입니다.

이때 ls를 쳐보시고 파일이 없어졌다고 놀라지 마세요. 아니 RCS에 버그가 있는 것 아니냐고 반문하시는 분이 계시겠지요... 아닙니다. 우리는 파일을 RCS 에다가 저장한 것입니다. 저장만 하면 안되겠지요. 그럼 꺼내는 방법을 말씀드리죠. co(check out)이라는 명령어를 사용합니다.

% co exam.c
RCS/exam.c,v -> exam.c
revision 1.1
done

그러면 다시 exam.c라는 파일이 생성이 됩니다. 이것이 RCS 의 대략적인 메카니즘입니다. 간단하죠. exam.c가 어떻게 변했나 볼까요.

exam.c


/* $Log: exam.c,v $
* Revision 1.1 1995/10/12 14:22:08 raxis
* Initial revision
* */

#include <stdio.h>

main()
{
     printf(' Hello \n' );
}

흠... 원래는 없던 메시지가 잔뜩 생겼네요. 이것은 RCS에서 자동적으로 생성시켜 주는 정보들입니다. 로그 파일(log file) 이름이 보이고요... 버전이 1.1 이고 1995/10/12 오후 2시에 만들었군요. 그리고 RCS 파일을 생성한 사람은 raxis(제 리눅스의 사용자 이름)이네요. 여기서 소수점 앞의 1은 release number이구요, 소수점 첫째 자리의 1은 level number 라고 합니다. 여기에 대한 자세한 설명은 3번째 강좌에서 다루도록 하겠습니다.

한가지 아무런 옵션을 붙이지 않고 그냥 co exam.c만 하면 읽기 전용(read only)모드로 만들어집니다. 흠. 그러면 "파일의 내용을 바꾸려면 exam.c의 퍼미션을 바꾸어야 하나요?" 하고 묻는 분이 계시겠네요. 아닙니다.

co 의 옵션중에 -l(lock을 의미)이 있습니다. 이것은 붙이면 exam.c를 생성시켜 주는데 쓰기(write)가 가능하도록 합니다.

% co -l exam.c
RCS/exam.c,v -> exam.c
revision 1.1 (locked)
done

그런데 아까랑 메시지가 약간 다르지요. (locked)라는 말이 추가 되었습니다. 'lock'의 뜻이 자물쇠라는 것을 아시나요. 쓰기 가능하게 하는 것과 자물쇠를 다는 것이 무슨 관계일까요? (이상하죠?)

제가 RCS의 기능을 설명한 부분에 RCS는 여러 사용자가 하나의 파일을 접근함으로써 생기는 문제를 해결할 수 있다고 했습니다. 다른 사용자가 내용을 고치려고 하면 메시지를 낸다고 했죠. 그러니까 RCS파일을 만든 사람이 아니라면 절대로 그 파일에 lock을 걸 수가 없습니다. 오로지 co exam.c만 가능하다는 것입니다.(읽기만) 그럼 상대적으로 RCS파일을 만든 사람은 그 반대로 쓰기가 가능하여야 된다는 결론이 이르게 되네요. 약간 이상한 결론이지만 현실이 그런걸 어쩌겠습니다. (^^)

다른 사람이 다음과 같이 한다고 가정합니다. 즉 RCS 디렉토리를 자신의 디렉토리로 링크(link)시켜서, exam.c를 check out 합니다.

%co -l exam.c
co error: RCS/exam.c,v: Permission denied

%co exam.c
RCS/exam.c,v -> exam.c
revision 1.1
done

흠... 제작 설명 드린 대로 역시 lock를 걸 수가 없군요. 파일의 모드를 한번 살펴봅시다. 읽기 모드로만 되어 있겠죠.

%ls -al exam.c
1 -r--r--r-- 1 guest users 157 Oct 12 23:48 exam.c

다시 한번 말씀드립니다. 이미 lock이 걸려 있는 파일은 다른 사람이 절대로 그 내용을 건드리지 못합니다. 흠. 데이터의 안전성을 보장하네요. 그런데 RCS 목록에 올릴 때마다 ci, co를 일일이 다 쓴다면 좀 귀찮은 작업 같은 기분이 들 겁니다. 그래서 ci 옵션에도 -l (lock) 이 있습니다. 즉, ci -l exam.c 라고 한다면 RCS/exam.c,v 란 파일을 변경하게 되고 원래 exam.c는 고대로 놓아두게 되죠.

그럼 이번엔 exam.c를 일주일 동안 생각해서 버전업을 하기로 결정했습니다. print라는 함수를 추가하기로 한 것이죠. 밤을 새는 디버그 끝에 드디어 다음 버전을 완성시켜서 RCS에 다시 등록시키기로 하겠습니다.

% ci -l exam.c ( -l 이 무슨 의미인지 아시겠죠 )
RCS/exam.c,v <- exam.c
new revision: 1.2; previous revision: 1.1
enter log message, terminated with single '.' or end of file:
>> function print() is added (타이핑하는 부분이죠.)
>> .
done

버전이 1.2로 올라갔군요. 뿌듯합니다. 자신의 프로그램도 이렇게 힘차게 버전업을 할 수가 있습니다. 그럼 그 결과를 한번 봅시다.

exam.c


/* $Log: exam.c,v $
* Revision 1.2 1995/10/12 15:05:58 raxis
* function print() is added
*
* Revision 1.1 1995/10/12 14:22:08 raxis
* Initial revision
* */ 

#include <stdio.h> 

void print( char* pszMsg )
{
     puts( pszMsg);
}

main()
{
     print(' Hello ');
} 

흠... 버전 1.2가 보이시죠. 1.2가 만들어진 날짜도 보이구요. raxis란 분께서 다시 버전업을 해주셨군요. 그런데 위에서 RCS의 모든 메시지들은 모두 코멘트(comment)처리되어 있다는 것을 눈치채셨는지.. 즉 컴파일할때 RCS부분은 없는 거나 마찬가지겠죠(당연한 소리).

제가 1부에서 RCS로 관리 할 수 있는 파일은 C 프로그램 소스만이 아니라고 했지요. 기억이 나실런지... RCS는 일반적으로 C(.c), 파스칼(.p), C++(.cc, .C), latex(.tex) 등의 프로그램은 확장자에 기초해서 코멘트 마크를 달게 됩니다. 그리고 나머지 파일들에 대해서는 대부분의 UNIX 쉘 스크립트에서 코멘트로 사용되는 '#' 마크를 사용하게 되는데..(좀 멍청한가요... 후후.) 그럼 postscript와 같이 '%'를 코멘트로 처리하는 파일들은 어떻게 할까요.

% rcs -c'%' beauty.ps

rcs라는 명령어는 RCS 파일의 속성을 바꾼다는 것을 기억하고 계시나요. beauty.ps로부터 만들어진 RCS 파일의 코멘트 부분은 '%'마크를 사용하라는 명령어입니다.

참고

RCS 에 대한 입문은 man rcsintro를 하시면 됩니다. RCS 에 대한 설명이 아주 긴 영어로 나옵니다. 해석하시면서 머리를 한번 식혀 보심이... ^^ 그리고, ci, co, rcs 에 대해서 더 잘 알고 싶으신 분은 man을 이용해 보시죠. UNIX에서 전문가가 되기 위해서는 매뉴얼을 열심히 봐야 된다고 하는 전설(?)이 있습니다.

다음장 예고

RCS 강좌는 8장으로 이루어져 있습니다. 웬만한 사용자는 지금까지의 내용을 충분히 이해한다면 5장 이후로는 구태여 볼 필요는 없다고 생각은 합니다만... 자기 나름대로의 연습만 어느 정도 하시면 될꺼라고 생각하거든요. 5장 이후에서는 약간의 고급 기능을 소개하고, Make와 RCS와의 관계, 그리고 RCS가 만병통치가 아니라는 것, 즉 RCS를 사용할 때는 어느 정도 주의가 필요하다는 것을 예를 들어 설명해 드리겠습니다.


이전페이지 다음페이지 차례