1992.10.15


SUBJECT: SCCS에 관한 메뉴얼





1.1 소개
	
	소스 화일들을 공동으로 쓸때 많은 사람이 고치면 변화를 기록하는 것은 중요하다.
	갱신되는 과정을 기록하는 것은 언제 왜 변화가 일어 났는지 알 수 있게 한다.
	Source Code Control System(SCCS)는 소스 화일들의 접근을 조절하고 이들의 변화를 
	살펴(monitor)볼 수 있다.
	SCCS는 단지 한 사용자에게 화일을 갱신 하도록 하고 모든 변화를 history화일에 
	기록한다.

	SCCS는 다음과 같은 일을 한다.
	
	* SCCS history로부터 어떤 버젼의 화일들도 가져올 수 있다.
	* 단지 당신만이 그것을 수정하기 위하여 그 버젼의 화일을 잠그고(lock) 확인할 수 
	  있다.  SCCS는 다른 사용자에 의해 무의식중에 바뀌지 않도록 한다.
	* 화일이 갱신된 내용을 확인 할 수 있다.
	  당신이 화일을 확인할때 또한 당신이 변화시킨 것을 요약하여 넣을 수 있다.
	* 화일을 수정할 수 있는 가를 확인 할 수 있다.
	* 선택한 버젼 사이의 차이를 확인 할 수 있다.
	* 변화를 요약한 version log를 볼 수 있다.

 - sccs명령

	SCCS는 sccs명령과 함께 쓴다.
	이것들은 /usr/sccs에 있다.

 - Initializing the SCCS history file : sccs create

	sccs create명령은 당신의 화일을 SCCS의 제어를 받도록 한다.
	이것은 새로운 history화일을 만들고 당신의 소스 화일을 초기 버젼으로 사용한다.
	기본으로 history화일은 SCCS subdirectory밑에 놓는다.: 만약 이 디렉토리가 
	없다면 만들수 있다.

	sparc% mkdir SCCS
	sparc% sccs create program.c

	program.c:
	1.1
	87 lines

	SCCS로부터 출력은 만들어진 화일의 이름과 버젼 번호(1.1),라인의 수를 보여준다.
	사고나 우연히 원본 화일이 손실되는 것을 방지하기 위하여 sccs create는 comma(,)로
	시작하는 다른 화일을 만든다.
	history화일이 성공적으로 초기화 되면 SCCS는 새로운,읽을수 만 있는 버젼을 가져온다.
	이 comma-file의 버젼을 확인한후 이상이 없으면 이것을 지울 수 있다.

	sparc% cmp ,program.c program.c
	( no output means that the files match exactly)
	sparc% rm ,program.c

	SCCS가 가져온(retrieve) read-only버젼을 편집(edit) 하지 마라.
	이 화일을 편집하기 전에 아래 설명할 sccs edit명령을 사용한다.
	history화일과 현재 버젼을 구별하기 위하여 SCCS는 앞에 's.'를 사용한다.

	sparc% ls SCCS
	s.program.c

	이것 때문에 hostory화일은 종종 s.화일("s-dot-file")로 부른다.
	또한 "SCCS-file"라고도 부른다.
	이 history화일의 형태는 sccsfile(5)에 설명되어 있다.

 - 기본 sccs subcommands

	다음의 sccs subcommand들은 기본 버젼을 제어하는 기능을 수행한다.
	이것들은 여기에 요약했고 create를 제외하고는 아래 sccs subcommand밑에 자세히 
	설명했다.

	create    history화일과 처음 버젼을 초기화 한다.
	edit      쓸 수 있는 버젼을 가져온다(편집을 위하여).
	          SCCS는 당신을 소유자로 쓸 수 있는 복사본을 가져오고 다른사람이 고치지
		  못하도록 history화일에 lock을 건다.
	delta     당신의 변화를 기록한다.
		  이것은 sccs edit동작을 수행하는 것이다.
		  고친 것을 기록하기 전에 SCCS는 주석 달기를 원하고 history화일의 버젼
		  log에 기록한다.
	get       s.file로부터 read-only copy를 가져온다.
		  기본적으로 이것은 가장 현재의 버젼이다.
		  가져온 버젼이 compilation,formatting,display을 위한 소스 화일로 사용되는
                  반면 어떤 방법으로도 편집되거나 고치려는 것은 아니다.

	당신이 filename argument로 디렉토리를 주면 sccs는 그 디렉토리안의 각 s.file에 
	subcommand를 수행하려 한다.

	sccs get SCCS

	위는 SCCS subdirectory의 모든 s.file의 read-only버젼을 가져온다.

	prt        각 버젼에 관계된 주석을 포함한 버젼 log를 보여준다.

 - Delta and version
	
	당신이 버젼을 확인할때 SCCS는 단지 앞의 버젼과 당신이 기록한 것 사이에 줄단위의 
	차이를 기록한다.
	이런 차이의 설정을 delta라고 말한다.
	edit나 get으로 가져온 버젼은 여기까지 증가된 delta로 구성된다.
	"delta"와 "version"은 종종 비슷하게 사용되나 그들의 의미가 정확히 같지는 않다.
	delta를 생략하고 version을 가져오는 것이 가능하다.
	(아래 Excluding Deltas from a Retrieved Version을 보라)

   SIDs

	SCCS delta ID혹은 SID는 특정한 delta를 나타내기 위하여 사용되는 숫자이다.
	이것은 dot(.)로 분리된 two-pair number이다.
	초기 delta의 SID는 기본으로 1.1이다.
	SID의 첫 부분은 release number,두번째는 level number이다.
	당신이 delta를 기록할때 level번호는 자동으로 증가한다.
	이 release번호는 필요에 따라 증가한다.
	SCCS는 또한 branch delta라는 두개의 첨가된 필드를 갖는다.
	(아래 Branch Deltas에 설명한다.)
	엄격히 이야기 하면 SID는 직접 delta를 말한다.
	그러나 이것은 delta와 앞의 것(predecessor)으로 구성하는 버젼을 가르키는데 사용된다.

   ID Keywords
	
	SCCS는 소스 화일안의 keyword를 전개하고 인식한다.
	이 keyword는 가져온 버젼(check-in version)에 버젼과 독립적인 정보(예로 SID같은)를 
	포함하는데 사용할 수 있다.
	화일을 편집하기 위하여 가져올때 ID keyword는 다음의 형태를 갖는다.

	%C%

	C는 대문자이다.
	당신이 이 화일을 가져올때 SCCS는 이 keyword를 그것이 의미하는 정보로 바꾼다.
	예로 %I%는 현재 버젼의 SID로 전개한다.
	당신은 전형적으로 주석이나 string definition안에 ID keyword를 포함시킬 수 있다. 
	만약 소스 화일안에 적어도 하나의 ID keyword를 포함하지 않는다면 SCCS는 다음과 같은
	diagniostic를 보낸다.

	NO Id Keywords (cm7)

	ID Keyword에 관한 보다 많은 정보는 아래의 Incorporating ID Keywords에 설명한다.

1.2 sccs subcommands

 - Checking Files In and Out

	다음의 subcommand들은 버젼을 가져오고 고치는데 유용하다.

  * checking out a file for editing: sccs edit

	소스를 편집하기 위하여 처음에 sccs edit를 사용한다.
	SCCS는 방금 가져온 delta ID를 보여주고 고친 것을 기록할때 delta ID를 할당한다.

	sparc% sccs edit program.c
	1.1
	new delta 1.2
	87 lines

	당신은 에디터를 사용하여 그것을 편집할 수 있다.
	만약 편집하기 위해 가져온 쓸 수 있 는(writable) 복사본이 있으면 sccs edit는 
	에러 메세지를 보낸다.
	다른 사람이 그것에 접근해도 쓸 수 없다.

  * checking in a new version: sccs delta

	당신의 화일을 가져와 편집을 끝내면 sccs delta를 사용하여 고친 것을 기록한다.
	이것을 "making delta"라고 부른다.
	갱신하기 전에 SCCS는 주석을 넣도록 프롬프트를 나타낸다.
	여기에는 변화시킨 것의 간단한 요약을 포함한다.

	sparc% sccs delta program.c
	comment?

	당신은 NEWLINE앞에 backslash로 줄을 늘려 주석을 첨가 할 수 있다.

	sparc% sccs delta program.c
	comment? corrected typo in widget(), \
	null pointer in n_crunch()
	1.2
	5 inserted
	3 deleted
	84 unchanged

  * changed lines count as lines deleted and inserted

	SCCS는 새 버젼의 SID를 나타내고 삽입되고 지워지고 바뀌지 않은 라인의 번호를 보여준다.
	SCCS는 working file을 제거한다.
	당신은 sccs get을 사용하여 read-only version을 가져온다.
	주석은 의미가 있다.왜냐 하면 당신은 같은 날 그 화일을 다시 가져 올 수 있다.
	일반적으로 사용하기 위하여 그 모줄을 installing이나 compiling하기 전에 모든 고친 화일을
	기록하는 것이 중요하다.
	좋은 방법은 필요한 화일을 편집(edit)하고,만족할때까지 고치고 compile하고 수정하고,그들을
	기록하고,get으로 read-only copy로 가져오고 그 모쥴을 recompile한다.

  * retriving a version: sccs get

	가장 최근의 화일을 가져오기 위하여 아래 명령을 사용한다.

	sccs get filename

	예로:

	sparc% sccs get program.c
	1.2
	86 lines

	위는 program.c를 가져오고 라인의 수와 버젼 번호를 보여준다.
	이 화일의 허가는 read-only이다.
	이 화일은 수정하지 마라.
	왜냐 하면 SCCS는 화일을 기록하지 않으면 새로운 delta를 만들지 않을 것이다.
	만약 강제로 수정하면 다음에 다른 사람이 sccs edit나 sccs get을 수행할때 그것들을
	잃어 버릴 수 있다.

  * reviewing pending changes: sccs diffs

	가지고 온 버젼을 수정하였으나 아직 기록하지 않았다면 pending되었다고 말한다.
	화일을 편집할때 'sccs diffs'를 사용하여 pending의 내용을 볼 수 있다.
	diffs subcommand는 working copy와 최근의 기록 된 버젼을 비교하기 위하여
	diff(1)명령를 사용한다.

	sparc% sccs diffs program.c
	-------- program.c --------
	37c37
	<	if (((cmd_p - cmd) + 1) == l_lim){
	---
	>	if (((cmd_p - cmd) - 1) == l_lim){

	diff명령의 대부분의 옵션이 사용될 수 있다.
	diff명령의 -c option에 대해서는 'sccs diffs'의 '-C' argument를 사용한다.

  * deleting pending changes: sccs unedit

	sccs unedit는 pending change를 하지 않도록 한다.
	이것은 편집하는 동안 화일이 손상을 입어 다시 시작하기를 원한다면 편리하다.
	unedit는 기록한 버젼을 제거하고 history file을 풀고(unlock) 가장 최근의 기록한 
	버젼의 read-only 화일을 가져온다.
	unedit를 사용한 후에는 결코 그 화일을 기록하지 않은 것과 같다.
	편집을 재개하려면 그 화일을 기록하기 위하여 sccs edit를 사용한다.
	(아래의 Repairing a Writable Copy를 또한 참조하라)

  * combining delta and get: sccs delget

	sccs delget은 delta와 get을 결합한다.
	이것은 당신의 변화를 기록하고 새로운 버젼의 read-only copy를 가져온다.
	그러나 SCCS가 delta동안 에러를 만나면 get을 수행하지 않는다.
	화일의 목록을 가져올때 delget은 할 수 있는 한 모두에게 get을 수행하고 만약 에러를 
	만나면 모두 에게서 get을 생략한다.

  * combining delta and edit: sccs deledit

	sccs deledit는 edit다음에 delta를 수행한다.
	당신은 버젼을 가져오고 즉시 편집을 수행하기 위하여 이것을 사용한다.

  * retrieving a version by SID: sccs get -r

	-r option은 가져오기 위한 특정한 ID를 지정하도록 한다.

	sparc% sccs get -r1.1 program.c
	1.1
	87 lines

  * retrieving a version by date and time: sccs get -c

	어떤 경우에 원하는 delta의 SID를 알지 못하는 경우가 생긴다.
	그러나 그것을 기록한 날짜를 알고 있다면 다음의 date-time argument와 -c option으로
	주어진 날짜 전의 가장 최근의 버젼을 가져올 수 있다.
	
	-cyy[mm[dd[hh[mm[ss]]]]]

	예로:

	sparc% sccs get -c880722120000 program.c
	1.2
	86 lines

	현재 버젼이 무엇이든 간에 July 22,1988 at 12:00 noon의 것을 가져온다.
	위의 예는 다음과 같이 쓸 수 있다.

	sparc% sccs get -c"88/07/22 12:00:00" program.c

  * repairing a writable copy: sccs get -k -G

	새로운 버젼을 기록하지 않고 sccs get -k -Gfilename은 쓸 수 있는 사본을 가져오고
	그것을 '-G'로 지정된 화일로 바꾼다.
	이것은 diff와 에디터로 손상된 working copy를 복구하거나 바꾸기를 원할때 유용하다.

 - Incorporating version dependent information: ID Keyword

	위에 언급한 것과 같이 SCCS는 ID keyword를 사용하여 check-in version안에 버젼에 독립적인
	정보를 포합하도록 한다.
	이 keyword는 화일안에 삽입되고 당신의 변화를 기록할때 자동적으로 대응되는 정보로 대체된다.
	SCCS ID keyword는 다음의 형태를 취한다.

	%C%

	여기서 C는 대문자이다.
	예로,%I%는 가장 현재의 SID를 나타낸다.
	%W%는 화일이름,SID,화일안에 단일한 문자 @(#)를 포함한다.
	이 문자는 텍스트와 실행 화일 둘다에서 what명령이 이것을 찾아서 보여준다.
	(what명령은 화일의 소스 버젼이나 언제 만들어 졌는지 볼 수 있다)
	%G% keyword는 가장 최근 delta의 날짜를 나타낸다.
	다른 keyword들과 문자는 이장의 끝에 Reference Tables 밑에 Identification Keywords에
	모아져 있다.
	C program안에 버젼에 관계된 정보를 포함하기 위하여 이와 같은 라인을 사용할 수 있다.

	static char SccsId[] = "%W%\t%G%";

	만약 program.c이라는 화일이 있다면 이 라인은 버젼 1.2가 불려질때 다음과 같이 나타난다.

	static char SccsId[] = "@(#)program.c 1.2 08/29/80";

	이 문자는 컴파일된 프로그램안에 정의 하였기 때문에 이것은 컴파일된 프로그램 내에 소스 
	화일의 정보를 포함할 수 있게 한다.
	what명령으로 이것을 볼 수 있다.

	sparc% cd /usr/ucb
	sparc% what sccs
	sccs
		sccs.c 1.13 88/02/08 SMI

	shell script와 그와 유사한 것에 대해서도 주석내에 ID keyword를 포함할 수 있다.

	# 	%W%	%G%
	.....

	확장된(expanded) keyword를 포함한 버젼을 기록 한다면 버젼에 관계된 정보는 더 이상
	갱신되지 않는다.
	이런 상황을 경고하기 위하여 SCCS는 다음의 경고를 준다.
	get,edit나 create가 ID keyword가 없다는 것을 발견할때 발생한다.

	No Id Keywords (cm7)

 - Making Inquiries

	다음의 subcommand는 화일의 상태나 history에 관한 질의를 위해 유용하다.

  * seeing which version has been retrieved: the what command

	SCCS는 화일의 history안에 어떤 버젼이든 가져오기 때문에 디렉토리안에 나타난 working 
	copy가 원하는 버젼을 반영하는 것인지 보증하지 못한다.
	what명령은 SCCS ID keyeord를 찾는다.
	이것은 또한 실행 화일에서 keyeord를 찾고 컴파일 할때의 소스 버젼을 보여준다.

	sparc% what program.c program
	program.c:
		program.c 1.1 88/07/05 SMI;
	program:
		program.c 1.1 88/07/05 SMI;

	이런 경우에 이 화일의 working copy의 버젼은 1.1이다.

  *  determine the most recent version: sccs get -g

	가장 최근의 delta의 SID를 보기 위하여 sccs get -g를 사용한다.

	sparc% sccs get -g program.c
	1.2

	이 경우는 가장 최근의 delta는 1.2이다.
	이것은 위의 보기에서 what에 의해 반영된 것보다 최근 버젼이기 때문에 아마 get은 새
	버젼을 원할 것이다.

  * determining who has a file checked out: sccs info

	편집될 화일이 무엇인지 발견하기 위하여 다음과 같이 한다.

	sccs info

	이 subcommand은 편집될 모든 화일의 목록을 보여준다.
	아울러 그 화일을 기록한 사용자와 같은 다른 정보도 포함되어 있다.
	비슷하게 다음의 명령도 사용한다.

	sccs check

	어떤 것이 편집되면 조용히 non-zero exit status값을 돌려준다.
	이것은 소스 화일이 기록한 상태면 make(1)가 멈춰 지도록 makefile안에 사용될 수 있다.
	만약 당신이 가져온 모든 화일들이 기록할 준비가 되어 있다는 것을 안다면 다음을 
	사용 할 수 있다.

	sccs delta `sccs tell -u`

	이것은 그들 모두에 작동한다.
	tell은 한 줄에 편집되어질 화일의 이름만 나타낸다.
	-u option과 함께 tell은 당신이 기록할 화일들만 나타낸다.
	만약 -u의 argument로 사용자 이름을 주면 sccs tell은 그 사용자가 기록할 화일들만 
	나타낸다.

  * Display delta comments: sccs prt

	sccs prt는 delta table로 알려진 version log를 보여준다.
	이것에는 SID,만들어진 시간과 날짜,각 버젼을 기록한 사람의 이름,삽입되고 
	지워지고 변하지 않은 줄의 수,주석등이 포함된다.

	sparc% sccs prt program.c
	D 1.2 80/08/29 12:35:31		pers	2	1	00005/00003/00084
	corrected typo in widget(),
	null pointer in n_crunch()

	D 1.1 79/02/05 00:19:31		zeno	1	0	00087/00000/00000
	date and time created 80/06/10 00:19:31 by zeno

	단지 최근의 것을 보기 위해서는 -y option을 사용하라.

  * updating a delta comment: sccs cdc

	만약 주석에 어떤 중요한 것을 포함하는 것을 잊어 버렸다면 다음을 사용하여 정보를
	추가힐 수 있다.

	sccs cdc -rsid

	delta는 가장 최근의 것이 되어야만 하고 delta를 가져온 사람이나 쓰기 허가가
	있는 사람이어야만 한다.
	cdc를 사용할때 SCCS는 주석을 넣으라고 하고 그것을 주석에 첨가한다.

	sparc% sccs cdc -r1.2 program.c
	comment? also taught get_in() to handle control chars

	새 주석을 prt로 보면 다음과 같다.

	sparc% sccs prt program.c
	D 1.2 80/08/29 12:35:31		pers	2	1	00005/00003/00084
        also taught get_in() to handle control chars
	*** CHANGED *** 88/08/02 14:54:45 pers
	corrected typo in widget(),
	null pointer in n_crunch()

	D 1.1 79/02/05 00:19:31		zeno	1	0	00087/00000/00000
	date and time created 80/06/10 00:19:31 by zeno

  * comparing cheched-in versions: sccs sccsdiff

	두개의 기록한 버젼(check-in version)을 비교하기 위하여 다음을 사용한다.

	sparc% sccs sccsdiff -r1.1 -r1.2 program.c

	delta 1.1과 1.2사이의 차이를 보기 위하여 diff의 대부분의 옵션이 사용된다.
	diff의 -c 옵션을 부르기 위하여 'sccsdiff'의 '-C' argument를 사용하라.
	-r 대신에 -cdate-time을 sccs의 옵션으로 사용한다.

  * displaying the entire history: sccs get -m -p

	만약 만들어진 delta와 화일의 모든 변화의 목록을 보기 위하여 get의 -m과 -p
	옵션을 사용 할 수 있다.

	sparc% sccs get -m -p program.c
	1.2
	84 lines
	1.2	$define L_LEN 256
	1.1
	1.1	#include
	1.1
	......

	특별한 delta에 관계된 줄을 보기 위하여 grep(1V)로 출력을 보낼 수 있다.

	sparc% sccs get -m -p program.c | grep '^1.2'

  * creating report: sccs prs -d

	SCCS control하에서 화일에 관한 보고를 이끌어 내기 위하여 -ddataspec과 함께
	prs subcommand를 사용할 수 있다.
	datspec은 history화일의 부분에 대응한 많은 i'datakeyword'를 제공한다.
	Data Keyword의 형태는 다음과 같다.

	:X:

	Data Keyword의 목록은 이장 끝에 Reference table에 설명한다.
	data keyword가 dataspec argument에 나타나는 수는 제한이 없다.
	분명한 dataspec argument는 data keyword와 텍스트로 구성된 문자이다.
	prs는 각 인식된 keyword를 history화일에서 적당한 값으로 바꾼다.
	data keyword의 형태는 간단하다.
	이것은 간단한 문자나 여러줄이 될 수 있다.
	tab은 '\t'로,return은 '\n'으로 나타낸다.
	여기에 예가 있다.

	sparc% sccs prs -d"Users and/or user IDs for :F: are:\n:UN:" program.c
	User and/or user ID for s.program.c are:
	zeno
	pers

	sparc% sccs prs -d"Newest delta for :M: :I:.  Created :D: by :P:." program.c
	Newest delta for program.c 1.3.  Created 88/07/22 by zeno

 - Deleting committed changes

  * replacing a delta: sccs fix
	delta는 작은 bug를 포함하고,typos와 같이,화일의 추적(audit trail)의 흔적(entry)를 
	요구하지 않고 수정할 필요가 있거나 delta의 주석이 불완전하거나 에러가 있을 수 있다.
	이런 경우에 당신은 부가적인 갱신을 하고 sccs fix를 사용하여 version log를 가장 
	최근의 delta로 바꿀 수 있다.

	sparc% sccs fix -r1.2 program.c

	이것은 program.c의 버젼 1.2를 기록한다.
	당신이 이 화일을 다시 가져올때 현재의 변화는history화일의 delta 1.2로 바꾸고
	SCCS는 (새로운)주석을 요구하는 프롬프트를 나타낸다.
	당신은 -r과 함께 SID를 써야만 한다.
	또한 지정한 delta는 leaf(most recent) delta이어야만 한다.
	앞에 기록한 delta가 효과적으로 지워졌음에도 불구하고 SCCS는 그것에 대한
	기록을 가진 history화일에 지워졌다고 표시한다.
	sccs fix를 사용하기 전에 현재 버젼의 복사본을 만드는 것이 좋은 생각이다.

  * removing a delta: sccs rmdel

	가장 최근 delta의 행적을 모두 지우기 위하여 rmdel이라는 것을 사용한다.
	당신은 -r을 사용하여 SID를 지정하여야만 한다.
	대부분의 경우에 fix가 rmdel을 사용하는 것보다 좋다.
	왜냐하면 fix는 지원진 delta의 기록을 남기나 rmdel은 그렇지 못하다.

  * reverting to an earlier version

	초기 버젼의 쓸 수 있는 복사본(writable copy)을 가져오기 위하여 'get -k'를 사용한다.
	이것은 과거의 몇몇 delta를 추적할 필요가 있을때 편리하다.
	새로운 것을 만드는 기초로 초기의 delta를 사용한다면:

	* 일반적으로 하는 것과 같이 화일을 기록하라.
	* 초기의 좋은 버젼의 쓸수 있는 복사본을 get -k를 사용하여 가져오라.

		sccs get -k -rsid -Goldname filename
	  -G옵션은 새로이 가져올 버젼의 이름을 나타낸다.
	* 현재의 버젼을 그전의 좋은 버젼으로 바꿔라.

		mv oldname filename

	* 마지막으로 화일을 다시 기록(check in)하라.
	  어떤 경우에는 어떤 delta를 제외시키는 것이 더 간단하다.
	  그렇치 않으면,갱신한 화일로 SCCS를 사용하여 분기(divergent)를 만드는
	  방법에 대해서는 아래의 Branch Deltas를 참조하라.
	
  * excluding deltas from a retrieved version

	delta 1.3에서 만들어진 변화를 다음의 1.4에서 적용할 수 없다고 가정하자.
	당신이 편집하기 위하여 화일을 가져올때 working copy로부터 delta 1.3을 제외 
	시키기 위하여 -x옵션을 사용할 수 있다.

	sparc% sccs edit -x1.3 program.c

	지금,당신이 delta 1.5를 기록할때 그 delta는 delta 1.4에서 만들어진
	변화는 포함하나 1.3은 포함하지 않는다.
	사실 -x에 콤마로 분리해,delta의 목록을 제외하거나 dash로 구분해 delta의 범위를
	정할 수 있다.
	예로,만약 1.3과 1.4를 제외 시키려면 다음과 같이 사용한다.

	sparc% sccs edit -x1.3,1.4 program.c

	혹은

	sparc% sccs edit -x1.3-1.4 program.c

	이 예에서

	sparc% sccs edit -x1.3-1 program.c

	위는 SCCS가 release 1에서  1.3부터 가장 높은 현재의 delta까지 제외한다.

  * combining versions: sccs comb

	comb명령은 실행할때 선택된 delta들이 결합되거나 제거되는 것을 기록하는 새로운
	history화일을 만드는 Bourne Shell script를 만든다.
	이것은 디스크 공간의 수요가 많을때 유용하다.

	경고 : 몇몇 delta를 결합하는데 comb-generated script는 주석을 포함한 화일의 
		version log를 파괴한다.

	-pSID옵션은 다시 만들어 지기 위하여 보존될 가장 오래된 delta를 가르킨다.
	또 다른 옵션

		-c sid-list

	위는 포함될 delta의 목록을 지정한다.
	sid-list는 콤마로 분리된 목록(list)이다.
	당신은 두 SID사이를 dash(-)로 범위를 줄 수 있다.
	-p와 -c는 함께 사용할 수 없다.
	-o옵션은 다시 만드는데 delta의 수를 최소화 하려고 한다.
	-s옵션은 다시 만든 것과 원본과의 크기를 비교하는 script를 수행한다.
	이 비교는 각각의 블럭의 수에 기초하여 다시 만든 것이 차지하는 원본의 퍼센트로
	주어진다.
	만약 옵션이 없으면 comb는 만들어진 변화를 간직하는데 필요한 최소한의 조상
	(ancestor)을 간직한다.

1.3 Version control for binary files

	SCCS가 전형적으로 ASCII text를 포함한 소스 화일에 사용하지만 SCCS의 SunOS version은
	binary화일의 버젼도 또한 적용한다.(NEWLINE으로 끝나지 않거나 control글자나 NULL을
	포함하는 화일들)
	이 binary화일은 기록할때 ACII의 형태로 코드화(encode) 된다.
	working copy들은 가져올때 다시 복구(decode)한다.
	당신은 icons,raster images,screen font같은 화일의 변화도 추적하기 위하여 SCCS를
	사용한다.
	당신은  binary화일을 화일로 취급하기 위하여 sccs create -b를 사용한다.
	delta나 create를  binary화일에 사용할때 다음의 메세지를 갖는다.

	Not a text file (ad31)

	또한 다음의 메세지를 가질 수 있다.

	No id keywords (cm7)

	이 메세지는 무시해도 상관없다.
	
	sparc% sccs create special.font

	special.font:
	Not a text file (ad31)
	No id keywords (cm7)
	1.1
	20 lines
	No id keyword (cm7)

	sparc% sccs get special.font
	1.1
	20 lines
	
	sparc% file special.font SCCS/s.special.font
	special.font:	 vfont definition
	SCCS/s.special.font:	SCCS

 	코드화된 binary화일은 버젼 사이에 많이 변할 수 있기 때문에 binary소스에 대한
	history화일은 ASCII소스에 비해 매우 빠르게 커질 수 있다.
	그러나 모든 소스 화일에 대한 같은 version control system을 사용하는 것은 
	그들을 다루는데 더 쉽다.

4.4 Maintaining source directories

	SCCS를 사용할때 실제 소스 화일은 working file이 아니라 history file이다.

  * duplicate source directories

	만약 프로젝트로 일하면서 개인적인 시험과 debugging을 위한 중복된 소스를 갖기
	원한다면 개개의 일하는 디렉토리를 SCCS subdirectory에 symbolic link을 할 수
	있다.

	sparc% cd /private/working/cmd.dir
	sparc% ln -s /usr/src/cmd/SCCS SCCS

	이것은 working copy의 개인적인 것을 가져오는 간단한 방법이고 다음을 사용한다.

	sccs get SCCS

	그 디렉토리에서 일하는 동안 원래 디렉토리에서 일하는 것과 같이 가져오고
	하고 기록 할 수 있다.

  * SCCS and make

	SCCS는 종종 software project를 수행하기 위하여 make(1)와 함께 사용된다.
	make의 SunOS version은 소스 화일을 자동으로 가져오도록 한다.
	(다른 버젼은 같은 일을 수행하기 위하여 특별한 법칙을 제공한다.)
	이것은 또한 모든 소스 화일의 초기 버젼을 가져올 수 있고 프로젝트의 초기 버젼을
	다시 만들기 위하여 make를 사용할 수 있다.

	sparc% mkdir old.release ; cd old.release
	sparc% ln -s ../SCCS SCCS
	sparc% sccs get -c"87/10/01" SCCS
	SCCS/s.Makefile
	1.3
	47 lines
	.....
	sparc% make
	....

	일반적으로 만들고 있는 동안은 소스 화일을 어느 누구도 가져 올 수 없다.
	
  * keeping SIDs consistent across files

	어떤 경우에 여러개로 구성된 소스에서 SID들을 일정하게 유지하는 것이 가능하다.
	여기에 기술은 한번에 모든 화일을 edit하는 것이다.
	화일이 필요할때마다 고칠 수 있고 모든 화일을 기록한다.
	이것은 화일 이름를 argument로 SCCS subdirectory를 지정함으로 쉽게 할 수 있다.

	sparc% sccs edit SCCS
	....
	sparc% sccs delta SCCS

	delta subcommand와 함께 단지 한번 주석을 넣도록 프롬프트를 보낸다.
	주석은 기입한 모든 화일에 적용된다.
	어떤 화일이 버뀔 것인지 결정하기 위하여 각각 화일의 delta table에 "lines added
	,deleted,unchanged"부분을 비교할 수 있다.

  * starting a new release

	프로그램의 새로운 release를 만들기 위하여 edit의 -rn옵션을 사용하여 편집하기
	위하여 확인할때 만들기 원하는 release number를 지정한다.

	sparc% sccs edit -r2 program.c

	이런 경우에 SID2.1을 갖는 release 2의 처음 level delta가 될 것이다.
	이 디렉토리의 모든 SCCS-file의 release number를 바꾸기 위하여

	sparc% sccs edit -r2 SCCS

  * temporary files used by SCCS

	SCCS가 s.file(즉,histroty file)을 수정했을때 이것은 x.file불리우는 임시 복사본에
	씀으로 수행한다.
	갱신이 끝났을때 SCCS는 전의 s.file을 x.file로 다시 쓴다(overwrite).
	이것은 history file이 과정이 정상적으로 끝났을때 손상을 입지 않도록 한다.
	x.file은 history file로 같은 디렉토리에 만들어 지고 같은 허가를 주고 effective
	user에 의해 소유된다
	SCCS file이 동시에 갱신되지 않게 하기 위하여 history를 갱신하는 subcommand는 
	z.file이라는 lock file을 만들고 갱신을 수행하는 프로세서의 PID를 포함한다.
	갱신이 끝나면 z.file는 제거된다.
	z.file은 SCCS file를 포함하는 디렉토리에 mode 444(read-only)로 만들어 지고
	effective user에 의해 소유된다.

1.5 Branches

	당신은 SCCS화일에 적용한 delta를 트리의 node로 생각 할 수 있다.
	root는 화일의 초기 버젼이라고 생각 할 수 있다.
	root delta(node)는 기본으로 '1.1'이고 자식들은 '1.2','1,3'등등으로 매긴다.
	초기에 언급한 것과 같이 SID의 처음 두 부분은 release와 level number이다.
	delta의 자식들의 이름은 level number를 증가시킨다.
	당신은 또한 그 화일에 중요한 부분을 고칠때 새로운 release로 기록 하는 법을 
	보게 될 것이다.
	새로운 release number는 앞의 release의 새로운 level을 지정하지 않는다면 
	모든 자식 delta에 적용된다.
	그래서 특정한 화일의 전개는 다음과 같이 나타낼 수 있다.

	s.file					file
	+------+					+-------+
	|      |                                        | 1.1   |
	|      |                                     +------+   |
	|      |                                     | 1.2  |   |
	|      |                                  +------+  |   |
	|      |                                  |  1.3 |  |---+ 
	+------+                                  |      |--+
                                               +------+  |
                                               | 1.4  |--+
			     +-------+	       |      |
			     | 2.1   | <----   |      |
                             |       |         +------+
			     |       |
			     +-------+

	우리는 이 구조를 SCCS delta tree의 'trunk'라고 부른다.
	이것은 SCCS file의 일반적인 발전을 표시한다.
	변화는 모든 앞의 delta에 의존한 부분이다.
	그러나 트리의 또 다른 가지를 만드는 것이 편리한 상황이 발생한다.
	예로 버젼 1.3을 사용하여 만드는 프로그램과 이미 release 2를 사용하여 발전
	시키는 경우를 생각해보자.
	그래서 release 2는 이미 어떤 delta를 갖는다.
	사용자가 버젼 1.3에 문제를 보고하여 release 2가 고쳐질때까지 기다릴 수 
	없다고 가정하자.
	이 문제를 고치는데 필요한 변화는 버젼 1.3의 delta에 적용되야만 할 것이다.
	이것은 새 버젼을 만들 것을 요구하나 release 2와 독립적으로 수행되어 진다.
	이 새 delta는 트리의 새 가지로 노드(node)를 형성한다.
	이 가지delta의 SID는 세개의 부분으로 구성된다: release,level number와
	branch와 sequence number

	release.level.branch.sequence

	각 가지(branch)에 할당된 가지 번호(branch number)는 특별한 trunk delta의 
	자식이다.
	처음 가지(branch)는 1,그 다음은 2 등등....
	sequence number는 순서대로 특정 가지(branch)의 각 delta에 할당된다.
	그래서 1.3.1.1은 아래 본것과 같이 delta 1.3,첫 branch의 첫번째 delta를
	나타낸다.

	s.file					file
	+------+					+-------+
	|      |                                        | 1.1   |
	|      |                                     +------+   |
	|      |                                     | 1.2  |   |
	|      |                                  +------+  |   |
	|      |                                  |  1.3 |  |---+ 
	+------+                                  |      |--+
                                               +--|      |---------->+-------+
                                               |  +------+           |1.3.1.1|
			     +-------+	       |  1.4 |              |       |
			     | 2.1   | <----   |      |              |       |
                             |       |         +------+              +-------+
			     |       |
			     +-------+

	가지(branch)의 개념은 트리의 어떤 delta에도 확장될 수 있다.
	결과의 이름 규약은 앞의 설명한 방법과 똑 같다.
	가지(branch) delta의 이름의 처음 두가지 요소는 조상 trunk delta의 것이다.
	branch component는 trunk의 위치에 관계없이 branch를 만들기 위하여 할당한다.
	그래서 branch delta는 항상 그것의 이름과 같은 것으로 구분하고 반면에 trunk
	delta는 branch delta의 이름으로 구분한다.
	trunk delta에서 branch delta까지 이어지는 전체 path를 결정하는 것은 불가능
	하다.
	예로,만약 delta 1.3이 그것으로부터 퍼져나온 하나의 가지가 있다면 그 가지의
	모든 delta는 '1.3.1.n'이라고 한다.
	만약 이 가지에서 delta가 또 다른 가지를 갖는다면 새 가지의 모든delta는 
	'1.3.2.n'이라는 이름을 갖는다.
	delta 1.3.2.2라는 이름에서 오는 유일한 정보는 조상이 delta 1.3인 두번째 
	가지의 두번째 delta라는 것이다.
	특히 그것과 그것의 trunk ancestor(1.3)사이의 모든 delta를 delta 1.3.2.2의
	이름으로 결정하는 것은 불가능하다.

	s.file					file
	+------+					+-------+
	|      |                                        | 1.1   |
	|      |                                     +------+   |
	|      |                                     | 1.2  |   |
	|      |                                  +------+  |   |
	|      |                                  |  1.3 |  |---+ 
	+------+                                  |      |--+
                                               +--|      |----->  +-------+
                                               |  +------+        |1.3.1.1|
			     +-------+	       |  1.4 |           |       |
			     | 2.1   | <----   |      |           | +-------+ 
                             |       |         +------+           +-|1.3.1.2|
	                  +-------+  |                              |       |
	                  | 2.2   |                                 |       |
		          |       |                                 +-------+
                          |       |                                    |
			  +-------+                 +-------+ <---------
                                                    |1.3.2.1|
                                                    |       |
						+-------+   |
              					|1.3.2.2|---+
						|       |
						|       |
						+-------+

	branch delta는 임의로 복잡한 트리 구조를 만든다.
	가지의 사용을 최소화하는 것이 가장 좋은 일이다.

 - Using branch

	bug fix와 같은 여러개로 다른 버젼을 만들 필요가 있을때 가지(branch)를 
	사용한다.
	가지를 만들기 전에 sccs admin을 사용하여 history화일에 'branch' flag를
	할 수 있어야만 한다.
	이것은 다음과 같이 한다.

	soarc% sccs admin -fb program.c

	-fb옵션은 history화일에 b(branch) flag를 설정한다.

  * creating a branch delta

	program.c에 대한 delta 1.3에서 가지를 만들기 위하여 아래와 같은 sccs edit를
	사용한다.

	sparc% sccs edit -r1.3 -b program.c

	편집할 버젼을 기록할때 branch delta는 SID 1.3.1.1이 될 것이다.
	그 다음 delta는 1.3.1.2 등등이 된다.

  * retrieving versions from branch deltas

	branch delta는 종종 get으로 가져오는 버젼을 포함하지 않는다.
	branch version을 가져오기 위하여 특별히 -r옵션을 그것에 요청해야만 한다.
	만약 다음 보기와 같이 sequence number를 생략한다면 SCCS는 가지중 가장 
	높은 delta를 가져온다.

	sparc% sccs get -r1.3.1 program.c

1.6 Administering SCCS files

	규약에 의해 history화일과 임시 화일은 SCCS 디렉토리에 위치한다.
	기본 화일 protection mechanism에 첨가하여 어떤 release는 풀어주고 어떤 
	사용자에게는 제한할 수 있다.(sccs-admin 참조)
	일반적으로 history화일은 SCCS 이외의 다른 유틸리티에 의해 수정되지
	않도록 444(모든 사람에게 read-only)로 되있다.
	일반적으로 history화일을 편집하는 것은 좋지 않다.
	history화일은 꼭 하나의 link를 갖는다.
	SCCS 유틸리티는 수정될 복사본(x.file)을 씀으로 history화일을 갱신한다.

 - interpreting error messages: sccs help

	help는 SCCS 에러 메세지와 유틸리티에 관한 정보를 보여준다.
	일반적으로 help는 SCCS 유틸리티의 이름이나 SCCS 에러 메세지의 코드를
	받는다.
	argument가 없다면 help는 하나를 넣도록 프롬프트를 보낸다.
	/usr/lib/help는 help가 보여주는 각종 메세지의 텍스트를 포함한다.

 - altering history file defaults: sccs admin

	admin명령을 사용하는데 설정할 수 있는 몇개의 파라메터가 있다.
	이것중 흥미로운 것은 프래그(flag)이다.
	프래그는 -f옵션을 사용하여 첨가할 수 있다.
	예로

	sparc% sccs admin -fd1 program.c

	'd'flag의 값을 1로 설정한다.
	이 프래그는 다음과 같이 지울 수 있다.

	sparc% sccs admin -dd program.c

	가장 잘 사용하는 프래그는 다음과 같다.

	b	sccs edit의 -b옵션을 사용하여 가지를 만들 수 있다.
	dSID 	sccs get과 sccs edit를 사용하는 기본 SID.
		이것이 release number라면 단지 특정한 release의 버젼을 포함한다.
	i	화일에 ID keyword가 없다면 fatal error를 준다.
		이것은 ID keyword가 실수에 의해 잃어버리거나 전개 되었을때 버젼이
		기록되지 않도록 한다.
	y	이 프래그의 값을 %Y% ID keyword로 바꾼다.
	-tfile 	file로부터 s.file에 설명문을 저장한다.
		이 설명문은 document나 design 이나 implementation document가 될 수 
		있다.
		-t옵션을 사용하면 s.file이 다른 사람에게 보내지면 document도 같이
		따라 가도록 한다.
		만약 file이 생략되면 설명문은 제거된다.
		설명문을 보기위해 prt -t를 사용한다.

 - validating the history file

	history화일을 확인하기 위하여 val명령을 사용할 수 있다.
	val는 항상 다음의 조건에서 시험한다.

	* 붕괴된(corrupted) history file
	* history file이 읽기 위해 열릴 수 없거나 화일이 SCCS history가 아니다.

	만약 -r옵션을 사용하면 val는 지적한 SID가 있는지를 시험한다.

 - restoring the history file

	특별히 나쁜 환경에서 history화일 그 자체가 망가 질 수 있다.
	이런 일이 발생하는 대부분의 이유는 어떤 사람이 그것을 편집할때이다.
	이 화일이 checksum을 가지고 있기 때문에 이 붕괴된 화일을 읽을때마다
	에러를 갖을 것이다.
	checksum을 올바로 하기 위하여 다음을 사용한다.

	sparc% sccs admin -z program.c

	경고: SCCS가 history화일이 망가 졌다고 할때 부정확한 checksum에 심각한 손상을
	     가르킨다.
	     history화일을 교정하기 전에 현재의 변화를 안전하게 하도록 조심하라.

1.7 Reference table

	table 1-1 SCCS IF keyword
	------------------------------------------------------------------------
	Keyword				Expands to
	------------------------------------------------------------------------
	%Z%		@(#)(search string for the what command)
	%M%		the current module(file) name
	%I%		the highest SID spplied
	%W%		shorthand for: %Z%%M% tab %I%
	%G%		the date of the delta corresponding to the %I% keyword
	%R%		the current release number
	%Y%		the value of the t flag(set by sccs admin)
	------------------------------------------------------------------------


	table 1-2 SCCS utility commands
	---------------------------------------
		SCCS utility programs
	---------------------------------------
	Commands	|	Refer to:
	---------------------------------------
	admin			sccs-admin(1)
	cdc			sccs-cdc(1)
	comb			sccs-comb(1)
	delta			sccs-delta(1)
	get			sccs-get(1)
	help			sccs-help(1)
	prs			sccs-prs(1)
	rmdel			sccs-rmdel(1)
	sact			sccs-sact(1)
	sccsdiff		sccs-sccsdiff(1)
	unget			sccs-unget(1)
	val			sccs-val(1)
	what			what(1)
	---------------------------------------


	table 1-3 Data keywords for 'prs -d'
	----------------------------------------------------------------------------------------
	keyword		data item		file section	value			fotmat
	----------------------------------------------------------------------------------------
	:Dt:	Delta information		Delta table	see below		S
	:DL:	Delta line statistics		    "		:Li:/:Ld:/:Lu:		S
	:Li:	Lines inserted by delta		    "		nnnnn			S
	:Ld:	Lines deleted by delta		    "		nnnnn			S
	:Lu:	Lines unchanged by delta	    "           nnnnn			S
	:DT:	delta type			    "		D or R			S
	:I:	SCCS ID string(SID)		    "		:R:.:L:.:B:.:S:		S
	:R:	Release number			    "		nnnn			S
	:L:	Level number			    "           nnnn			S
	:B:	Branch number			    "		nnnn			S
	:S:	Sequence number			    "		nnnn			S
	:D:	Data delta created		    "		:Dy:/:Dm:/:Dd:		S
	:Dy:	Year delta created		    "		nn			S
	:Dm:	Month delta created		    "		nn			S
	:Dd:	Day delta created		    "		nn			S
	:T:	Time delta created		    "		:Th:::Tm:::Ts:		S
	:Th:	Hour delta created		    "		nn			S
	:Tm:	Minutes delta created		    "		nn			S
	:Ts:	Seconds delta created		    "		nn			S
	:P:	Programmer who created delta	    "		logname			S
	:DS:	Delta sequence number		    "		nnnn			S
	:DP:	Predecessor delta seq-no	    "		nnnn			S
	:DI:	Sequence number of deltas	    "		nnnn			S
		  included,excluded,ignored
	:Dn:	Delta included(seq #)		    "		:DS: :DS:....		S
	:Dx:	Delta excluded(seq #)		    "		:DS: :DS:....		S
	:Dg:	Delta ignored(seq #)		    "		:DS: :DS:....		S
	:MR:	MR numbers for delta		    "		text			M
	:C:	Comments for delta		    "		text			M
	:UN:	User names			User named	text			M
	:FL:	Flag list			Flags		text			M
	:Y:	Module type flag		    "		text			S
	:MF:	MR validation flag		    "		yes or no		S
	:MP:	MR validation pgm name		    "		text			S
	:KF:	Keyword error/warning flag	    "		yes or no		S
	:BF:	Branch flag			    "		yes or no		S
	:J:	Joint edit flag			    "		yes or no		S
	:LK:	Locked releases			    "		:R:....			S
	:Q:	User defined keyword		    "		text			S
	:M:	Module name			    "		text			S
	:FB:	Floor boundary			    "		:R:			S
	:CB:	Ceiling boundary		    "		:R:			S
	:Ds:	Default SID			    "		:I:			S
	:ND:	Null delta flag			    "		yes or no		S
	:FD:	File descriptive text		Comments	text			M
	:BD:	Body				Body		text			M
	:GB:	Gotten body			    "		test			M
	:W:	A form of what(1) string	N/A		:Z::M:\t:I:		S
	:A:	A form of what(1) string        N/A		:Z::Y: :M: :I::Z:	S
	:Z:	what(1) string delimiter	N/A		@(#)			S
	:F:	SCCS file name			N/A		text			S
	:PN:	SCCS file path name		N/A		text			S
	----------------------------------------------------------------------------------------
	S= single-line format,M = multi-line
	:Dt: = :DT: :I: :D: :T: :P: :DS: :DP:
	----------------------------------------------------------------------------------------





Revision History
Created        on Oct  15 ,1992