|
|
1.1 root 1: .\ Format this file with:
2: .\ pic file | tbl | troff -ms
3:
4: .\ PS and PE center pic diagrams. (The corresponding ms-macros may not.)
5: .de PS
6: .nr pE (\\n(.lu-\\$2u)/2u
7: .in +\\n(pEu
8: .ne \\$1u
9: ..
10: .de PE
11: .in -\\n(pEu
12: ..
13: .de D(
14: .DS
15: .nr VS 12pts
16: .vs 12pts
17: .I
18: ..
19: .de D)
20: .DE
21: .nr VS 18pts
22: .vs 18pts
23: .R
24: ..
25:
26: .ND July 1985
27: .RP
28: .TL
29: RCS \- A System for Version Control
30:
31: .AU
32: Walter F. Tichy
33: .AI
34: Department of Computer Sciences
35: Purdue University
36: West Lafayette, Indiana 47907
37:
38: .AB
39: An important problem in program development and maintenance is version control,
40: i.e., the task of keeping a software system consisting of many versions and
41: configurations well organized.
42: The Revision Control System (RCS)
43: is a software tool that assists with that task.
44: RCS manages revisions of text documents, in particular source programs,
45: documentation, and test data.
46: It automates the storing, retrieval, logging and identification of revisions,
47: and it provides selection mechanisms for composing configurations.
48: This paper introduces basic version control concepts and
49: discusses the practice of version control
50: using RCS.
51: For conserving space, RCS stores deltas, i.e., differences between
52: successive revisions. Several delta storage methods are discusses.
53: Usage statistics show that RCS's delta storage method is
54: space and time efficient.
55: The paper concludes with a detailed survey of version control tools.
56:
57: \fBKeywords\fR: configuration management, history management,
58: version control, revisions, deltas.
59: .AE
60: .FS
61: A version of this paper was published in Software--Practice and Experience,
62: Vol. 15(7), 637-654 (July 1985).
63: .FE
64: .nr VS 18pts
65: .EQ
66: delim $$
67: .EN
68: .LP
69: .NH
70: Introduction
71: .PP
72: Version control is the task of keeping software
73: systems consisting of many versions and configurations well organized.
74: The Revision Control System (RCS) is a set of UNIX
75: commands that assist with that task.
76: .PP
77: RCS' primary function is to manage \fIrevision groups\fR.
78: A revision group is a set of text documents, called \fIrevisions\fR,
79: that evolved from each other. A new revision is
80: created by manually editing an existing one.
81: RCS organizes the revisions into an ancestral tree. The initial revision
82: is the root of the tree, and the tree edges indicate
83: from which revision a given one evolved.
84: Besides managing individual revision groups, RCS provides
85: flexible selection functions for composing configurations.
86: RCS may be combined with MAKE\u1\d,
87: resulting in a powerful package for version control.
88: .PP
89: RCS also offers facilities for
90: merging updates with customer modifications,
91: for distributed software development, and
92: for automatic identification.
93: Identification is the `stamping'
94: of revisions and configurations with unique markers.
95: These markers are akin to serial numbers,
96: telling software maintainers unambiguously which configuration
97: is before them.
98: .PP
99: RCS is designed for both production and experimental
100: environments.
101: In production environments,
102: access controls detect update conflicts and prevent overlapping changes.
103: In experimental environments, where strong controls are
104: counterproductive, it is possible to loosen the controls.
105: .PP
106: Although RCS was originally intended for programs, it is useful for any
107: text that is revised frequently and whose previous revisions must be
108: preserved. RCS has been applied successfully to store the source
109: text for drawings, VLSI layouts, documentation, specifications,
110: test data, form letters and articles.
111: .PP
112: This paper discusses the practice of
113: version control using RCS.
114: It also introduces basic version control concepts,
115: useful for clarifying current practice and designing similar systems.
116: Revision groups of individual components are treated in the next three sections,
117: and the extensions to configurations follow.
118: Because of its size, a survey of version control tools
119: appears at the end of the paper.
120: .NH
121: Getting started with RCS
122: .PP
123: Suppose a text file \fIf.c\fR is to be placed under control of RCS.
124: Invoking the check-in command
125: .D(
126: ci f.c
127: .D)
128: creates a new revision group with the contents of
129: \fIf.c\fR as the initial
130: revision (numbered 1.1)
131: and stores the group into the file \fIf.c,v\fR.
132: Unless told otherwise, the command deletes \fIf.c\fR.
133: It also asks for a description of the group.
134: The description should state the common purpose of all revisions in the group,
135: and becomes part of the group's documentation.
136: All later check-in commands will ask for a log entry,
137: which should summarize the changes made.
138: (The first revision is assigned a default log message,
139: which just records the fact that it is the initial revision.)
140: .PP
141: Files ending in \fI,v\fR
142: are called \fIRCS files\fR (\fIv\fR stands for \fIv\fRersions);
143: the others are called working files.
144: To get back the working file \fIf.c\fR in the previous example,
145: execute the check-out command:
146: .D(
147: co f.c
148: .D)
149: .R
150: This command extracts the latest revision from
151: the revision group \fIf.c,v\fR and writes
152: it into \fIf.c\fR.
153: The file \fIf.c\fR can now be edited and, when finished,
154: checked back in with \fIci\fR:
155: .D(
156: ci f.c
157: .D)
158: \fICi\fR assigns number 1.2 to
159: the new revision.
160: If \fIci\fR complains with the message
161: .D(
162: ci error: no lock set by <login>
163: .D)
164: then the system administrator has decided to configure RCS for a
165: production environment by enabling the `strict locking feature'.
166: If this feature is enabled, all RCS files are initialized
167: such that check-in operations require a lock on the previous revision
168: (the one from which the current one evolved).
169: Locking prevents overlapping modifications if several people work on the same file.
170: If locking is required, the revision should
171: have been locked during the check-out by using
172: the option \fI-l\fR:
173: .D(
174: co -l f.c
175: .D)
176: Of course it is too late now for the check-out with locking, because
177: \fIf.c\fR has already been changed; checking out the file again
178: would overwrite the modifications.
179: (To prevent accidental overwrites, \fIco\fR senses the presence
180: of a working file and asks whether the user really intended to overwrite it.
181: The overwriting check-out is sometimes useful for
182: backing up to the previous revision.)
183: To be able to proceed with the check-in in the present case, first execute
184: .D(
185: rcs -l f.c
186: .D)
187: This command retroactively locks the latest revision, unless someone
188: else locked it in the meantime. In this case, the two programmers
189: involved have to negotiate whose
190: modifications should take precedence.
191: .PP
192: If an RCS file is private, i.e., if only the owner of the file is expected
193: to deposit revisions into it, the strict locking feature is unnecessary and
194: may be disabled.
195: If strict locking is disabled,
196: the owner of the RCS file need not have a lock for check-in.
197: For safety reasons, all others
198: still do. Turning strict locking off and on is done with the commands:
199: .D(
200: rcs -U f.c \fRand\fI rcs -L f.c
201: .D)
202: These commands enable or disable the strict locking feature for each RCS file
203: individually.
204: The system administrator only decides whether strict locking is
205: enabled initially.
206: .PP
207: To reduce the clutter in a working directory, all RCS files can be moved
208: to a subdirectory with the name \fIRCS\fR.
209: RCS commands look first into that directory for RCS files.
210: All the commands presented above work
211: with the \fIRCS\fR subdirectory without change.\(dg
212: .FS
213: \(dg Pairs of RCS and working files can actually be specified in 3 ways:
214: a) both are given, b) only the working file is given, c) only the
215: RCS file is given.
216: If a pair is given, both files may have arbitrary path prefixes;
217: RCS commands pair them up intelligently.
218: .FE
219: .PP
220: It may be undesirable that \fIci\fR deletes the working file.
221: For instance, sometimes one would like to save the current revision,
222: but continue editing.
223: Invoking
224: .D(
225: ci -l f.c
226: .D)
227: checks in \fIf.c\fR as usual, but performs an additional
228: check-out with locking afterwards. Thus, the working file does
229: not disappear after the check-in.
230: Similarly, the option
231: \fI-u\fR does a check-in followed by a check-out without
232: locking. This option is useful if the file is needed for compilation after the check-in.
233: Both options update the identification markers in the working file
234: (see below).
235: .PP
236: Besides the operations \fIci\fR and \fIco\fR, RCS provides the following
237: commands:
238: \fIident\fR (extract identification markers),
239: \fIrcs\fR (change RCS file attributes),
240: \fIrcsclean\fR (remove unchanged working files),
241: \fIrcsdiff\fR (compare revisions),
242: \fIrcsfreeze\fR (record a configuration),
243: \fIrcsmerge\fR (merge revisions),
244: and \fIrlog\fR (read log messages and other information in RCS files).
245: A synopsis of these commands appears in the Appendix.
246: .NH 2
247: Automatic Identification
248: .PP
249: RCS can stamp source and object code with special identification strings,
250: similar to product and serial numbers.
251: To obtain such identification, place the marker
252: .D(
253: $Header$
254: .D)
255: into the text of a revision, for instance inside a comment.
256: The check-out operation will replace this marker with a string of the form
257: .D(
258: $Header: filename revisionnumber date time author state locker $
259: .D)
260: This string need never be touched, because \fIco\fR keeps it
261: up to date automatically.
262: To propagate the marker into object code, simply put
263: it into a literal character string. In C, this is done as follows:
264: .D(
265: static char rcsid[] = "$Header$";
266: .D)
267: The command \fIident\fR extracts such markers from any file, in particular from
268: object code.
269: \fIIdent\fR helps to find out
270: which revisions of which modules were used in a given program.
271: It returns a complete and unambiguous component list,
272: from which a copy of the program can be reconstructed.
273: This facility is invaluable for program maintenance.
274: .PP
275: There are several additional identification markers, one for each component
276: of $Header$.
277: The marker
278: .D(
279: $Log$
280: .D)
281: has a similar function. It accumulates
282: the log messages that are requested during check-in.
283: Thus, one can maintain the complete history of a revision directly inside it,
284: by enclosing it in a comment.
285: Figure 1 is a partial reproduction of a log contained in revision 4.1 of
286: the file \fIci.c\fR. The log appears at the beginning of the file,
287: and makes it easy to determine what the recent modifications were.
288: .sp
289: .nr VS 12pts
290: .vs 12pts
291: .ne 18
292: .nf
293: .in +0.5i
294: /* $Log: ci.c,v $
295: * Revision 4.1 83/05/10 17:03:06 wft
296: * Added option -d and -w, and updated assignment of date, etc. to new delta.
297: * Added handling of default branches.
298: *
299: * Revision 3.9 83/02/15 15:25:44 wft
300: * Added call to fastcopy() to copy remainder of RCS file.
301: *
302: * Revision 3.8 83/01/14 15:34:05 wft
303: * Added ignoring of interrupts while new RCS file is renamed;
304: * avoids deletion of RCS files by interrupts.
305: *
306: * Revision 3.7 82/12/10 16:09:20 wft
307: * Corrected checking of return code from diff.
308: * An RCS file now inherits its mode during the first ci from the working file,
309: * except that write permission is removed.
310: */
311: .in 0
312: .ce 1
313: Figure 1. Log entries produced by the marker $Log$.
314: .fi
315: .nr VS 18pts
316: .vs 18pts
317: .sp 0
318: .LP
319: Since revisions are stored in the form of differences,
320: each log message is
321: physically stored once,
322: independent of the number of revisions present.
323: Thus, the $Log$ marker incurs negligible space overhead.
324: .NH
325: The RCS Revision Tree
326: .PP
327: RCS arranges revisions in an ancestral tree.
328: The \fIci\fR command builds this tree; the auxiliary command \fIrcs\fR
329: prunes it.
330: The tree has a root revision, normally numbered 1.1, and successive revisions
331: are numbered 1.2, 1.3, etc. The first field of a revision number
332: is called the \fIrelease number\fR and the second one
333: the \fIlevel number\fR. Unless given explicitly,
334: the \fIci\fR command assigns a new revision number
335: by incrementing the level number of the previous revision.
336: The release number must be incremented explicitly, using the
337: \fI-r\fR option of \fIci\fR.
338: Assuming there are revisions 1.1, 1.2, and 1.3 in the RCS file f.c,v, the command
339: .D(
340: ci -r2.1 f.c \fRor\fI ci -r2 f.c
341: .D)
342: assigns the number 2.1 to the new revision.
343: Later check-ins without the \fI-r\fR option will assign the numbers 2.2, 2.3,
344: and so on.
345: The release number should be incremented only at major transition points
346: in the development, for instance when a new release of a software product has
347: been completed.
348: .NH 2
349: When are branches needed?
350: .PP
351: A young revision tree is slender:
352: It consists of only one branch, called the trunk.
353: As the tree ages, side branches may form.
354: Branches are needed in the following 4 situations.
355: .IP "\fITemporary fixes\fR"
356: .sp 0
357: Suppose a tree has 5 revisions grouped in 2 releases,
358: as illustrated in Figure 2.
359: Revision 1.3, the last one of release 1, is in operation at customer sites,
360: while release 2 is in active development.
361: .ne 4
362: .PS 4i
363: .ps -2
364: box "1.1"
365: arrow
366: box "1.2"
367: arrow
368: box "1.3"
369: arrow
370: box "2.1"
371: arrow
372: box "2.2"
373: arrow dashed
374: .ps +2
375: .PE
376: .ce 1
377: Figure 2. A slender revision tree.
378: .sp 0
379: Now imagine a customer requesting a fix of
380: a problem in revision 1.3, although actual development has moved on
381: to release 2. RCS does not permit an extra
382: revision to be spliced in between 1.3 and 2.1, since that would not reflect
383: the actual development history. Instead, create a branch
384: at revision 1.3, and check in the fix on that branch.
385: The first branch starting at 1.3 has number 1.3.1, and
386: the revisions on that branch are numbered 1.3.1.1, 1.3.1.2, etc.
387: The double numbering is needed to allow for another
388: branch at 1.3, say 1.3.2.
389: Revisions on the second branch would be numbered
390: 1.3.2.1, 1.3.2.2, and so on.
391: The following steps create
392: branch 1.3.1 and add revision 1.3.1.1:
393: .sp 0
394: .I
395: .nr VS 12pts
396: .vs 12pts
397: .TS
398: tab(%);
399: l l l.
400: %co -r1.3 f.c % -- check out revision 1.3
401: %edit f.c % -- change it
402: %ci -r1.3.1 f.c % -- check it in on branch 1.3.1
403: .TE
404: .nr VS 18pts
405: .vs 18pts
406: .R
407: This sequence of commands transforms the tree of Figure 2 into
408: the one in Figure 3.
409: Note that it may be necessary to incorporate the differences
410: between 1.3 and 1.3.1.1
411: into a revision at level 2. The operation \fIrcsmerge\fR automates this
412: process (see the Appendix).
413: .ne 7
414: .PS 4i
415: .ps -2
416: box "1.1"
417: arrow
418: box "1.2"
419: arrow
420: R13: box "1.3"
421: arrow
422: R21: box "2.1"
423: arrow
424: R22: box "2.2"
425: arrow dashed
426: line invis down from R21.s
427: RB1: box "1.3.1.1"
428: arrow dashed right from RB1.e
429: arrow from R13.s to RB1.w
430: .ps +2
431: .PE
432: .ce 1
433: Figure 3. A revision tree with one side branch
434:
435: .IP "\fIDistributed development and customer modifications\fR"
436: .sp 0
437: Assume a situation as in Figure 2, where revision 1.3 is in operation
438: at several customer sites,
439: while release 2 is in development.
440: Customer sites should use RCS to store the distributed software.
441: However, customer modifications should not be placed on the same branch
442: as the distributed source; instead, they should be placed on a side branch.
443: When the next software distribution arrives,
444: it should be appended to the trunk of
445: the customer's RCS file, and the customer
446: can then merge the local modifications back into the new release.
447: In the above example, a
448: customer's RCS file would contain the following tree, assuming
449: that the customer has received revision 1.3, added his local modifications
450: as revision 1.3.1.1, then received revision 2.4, and merged
451: 2.4 and 1.3.1.1, resulting in 2.4.1.1.
452: .ne 7
453: .PS 4i
454: .ps -2
455: R13: box "1.3"
456: line invis
457: R21: box invis
458: line invis
459: R22: box invis
460: line invis
461: R24: box "2.4"
462: line invis
463: R25: box invis
464: line invis
465: arrow from R13.e to R24.w
466: line invis down from R21.s
467: RB1: box "1.3.1.1"
468: arrow from R13.s to RB1.w
469: right
470: line invis down from R25.s
471: RB2: box "2.4.1.1"
472: arrow from R24.s to RB2.w
473: .ps +2
474: .PE
475: .ce 1
476: Figure 4. A customer's revision tree with local modifications.
477: .sp 1
478: This approach is actually practiced in the CSNET project,
479: where several universities and a company cooperate
480: in developing a national computer network.
481: .IP "\fIParallel development\fR"
482: .sp 0
483: Sometimes it is desirable to explore an alternate design or
484: a different implementation technique in parallel with the
485: main line development. Such development
486: should be carried out on a side branch.
487: The experimental changes may later be moved into the main line, or abandoned.
488: .IP "\fIConflicting updates\fR"
489: .sp 0
490: A common occurrence is that one programmer
491: has checked out a revision, but cannot complete the assignment
492: for some reason. In the meantime, another person
493: must perform another modification
494: immediately. In that case, the second person should check-out the same revision,
495: modify it, and check it in on a side branch, for later merging.
496: .PP
497: Every node in a revision tree consists of the following attributes:
498: a revision number, a check-in date and time, the author's identification,
499: a log entry, a state and the actual text. All these attributes
500: are determined at the time the revision is checked in.
501: The state attribute indicates the status of a revision.
502: It is set automatically to `experimental' during check-in.
503: A revision can later be promoted to a higher status, for example
504: `stable' or `released'. The set of states is user-defined.
505: .NH 2
506: Revisions are represented as deltas
507: .PP
508: For conserving space, RCS stores revisions in the form
509: of deltas, i.e., as differences between revisions.
510: The user interface completely hides this fact.
511: .PP
512: A delta is a sequence of edit commands that transforms one string
513: into another. The deltas employed by RCS are line-based, which means
514: that the only edit commands allowed are insertion and deletion of lines.
515: If a single character in a line is changed, the
516: edit scripts consider the entire line changed.
517: The program \fIdiff\fR\u2\d
518: produces a small, line-based delta between pairs of text files.
519: A character-based edit script would take much longer to compute,
520: and would not be significantly shorter.
521: .PP
522: Using deltas is a classical space-time tradeoff: deltas reduce the
523: space consumed, but increase access time.
524: However, a version control tool should impose as little delay
525: as possible on programmers.
526: Excessive delays discourage the use of version controls,
527: or induce programmers to take shortcuts that compromise system integrity.
528: To gain reasonably fast access time for both editing and compiling,
529: RCS arranges deltas in the following way.
530: The most recent revision on the trunk is stored intact.
531: All other revisions on the trunk are stored as reverse deltas.
532: A reverse delta describes how to go backward in the development history:
533: it produces the desired revision if applied to the successor of that revision.
534: This implementation has the advantage
535: that extraction of the latest revision is a simple and fast copy
536: operation.
537: Adding a new revision to the trunk is also fast: \fIci\fR simply
538: adds the new revision intact, replaces the previous
539: revision with a reverse delta, and keeps the rest of the old deltas.
540: Thus, \fIci\fR requires the computation
541: of only one new delta.
542: .PP
543: Branches need special treatment. The naive solution would be to
544: store complete copies for the tips of all branches.
545: Clearly, this approach would cost too much space. Instead,
546: RCS uses \fIforward\fR deltas for branches. Regenerating a revision
547: on a side branch proceeds as follows. First, extract the latest revision
548: on the trunk; secondly, apply reverse deltas until the fork revision for
549: the branch is obtained; thirdly, apply forward deltas until the desired
550: branch revision is reached. Figure 5 illustrates a tree with
551: one side branch. Triangles pointing to the left and right represent
552: reverse and forward deltas, respectively.
553: .ne 8
554: .PS 4i
555: .ps -2
556: define BD X [line invis $1 right .5;
557: line up .3 then left .5 down .3 then right .5 down .3 then up .3] X
558:
559: define FD X [line invis $1 right .5;
560: line left .5 down .3 then up .6 then right .5 down .3;] X
561:
562: right
563: D11: BD(" 1.1")
564: arrow right from D11.e
565: D12: BD(" 1.2")
566: arrow right from D12.e
567: D13: BD(" 1.3")
568: arrow right from D13.e
569: D21: BD(" 2.1")
570: arrow right from D21.e
571: D22: box "2.2"
572: line invis down from D21.s
573: F1: FD("1.3.1.1 ")
574: arrow from D13.se to F1.w
575: arrow from F1.e right
576: right
577: F2: FD("1.3.1.2 ")
578: .ps +2
579: .PE
580: .ce 1
581: Figure 5. A revision tree with reverse and forward deltas.
582: .sp 0
583: .PP
584: Although implementing fast check-out for the latest trunk revision,
585: this arrangement has the disadvantage that generation of other revisions
586: takes time proportional to the number of deltas applied. For example,
587: regenerating the branch tip in Figure 5 requires application of five
588: deltas (including the initial one). Since usage statistics show that
589: the latest trunk revision is the one that is retrieved in 95 per cent
590: of all cases (see the section on usage statistics), biasing check-out time
591: in favor of that revision results in significant savings.
592: However, careful implementation of the delta application process is
593: necessary to provide low retrieval overhead for other revisions, in
594: particular for branch tips.
595: .PP
596: There are several techniques for delta application.
597: The naive one is to pass each delta to a general-purpose text editor.
598: A prototype of RCS invoked the UNIX editor \fIed\fR both
599: for applying deltas and for expanding the identification markers.
600: Although easy to implement, performance was poor, owing to the
601: high start-up costs and excess generality of \fIed\fR. An intermediate
602: version of RCS used a special-purpose, stream-oriented editor.
603: This technique reduced the cost of applying a delta to the cost of
604: checking out the latest trunk revision. The reason for this behavior
605: is that each delta application involves a complete pass over
606: the preceding revision.
607: .PP
608: However, there is a much better algorithm. Note that the deltas are
609: line oriented and that most of the work of a stream editor involves
610: copying unchanged lines from one revision to the next. A faster
611: algorithm avoids unnecessary copying of character strings by using
612: a \fIpiece table\fR.
613: A piece table is a one-dimensional array, specifying how a given
614: revision is `pieced together' from lines in the RCS file.
615: Suppose piece table \fIPT\dr\u\fR represents revision \fIr\fR.
616: Then \fIPT\dr\u[i]\fR contains the starting position of line \fIi\fR
617: of revision \fIr\fR.
618: Application of the next delta transforms piece table \fIPT\dr\u\fR
619: into \fIPT\dr+1\u\fR. For instance, a delete command removes a
620: series of entries from the piece table. An insertion command inserts
621: new entries, moving the entries following the insertion point further down the
622: array. The inserted entries point to the text lines in the delta.
623: Thus, no I/O is involved except for reading the delta itself. When all
624: deltas have been applied to the piece table, a sequential pass
625: through the table looks up each line in the RCS file and copies it to
626: the output file, updating identification markers at the same time.
627: Of course, the RCS file must permit random access, since the copied
628: lines are scattered throughout that file. Figure 6 illustrates an
629: RCS file with two revisions and the corresponding piece tables.
630: .ne 13
631: .sp 12
632: .ce 1
633: Figure 6. An RCS file and its piece tables
634: .sp 0
635: .PP
636: The piece table approach has the property that the time for applying a single
637: delta is roughly determined by the size of the delta, and not by the
638: size of the revision. For example, if a delta is
639: 10 per cent of the size of a revision, then applying it takes only
640: 10 per cent of the time to generate the latest trunk revision. (The stream
641: editor would take 100 per cent.)
642: .PP
643: There is an important alternative for representing deltas that affects
644: performance. SCCS\u3\d,
645: a precursor of RCS, uses \fIinterleaved\fR deltas.
646: A file containing interleaved deltas is partitioned into blocks of lines.
647: Each block has a header that specifies to which revision(s) the block
648: belongs. The blocks are sorted out in such a way that a single
649: pass over the file can pick up all the lines belonging to a given
650: revision. Thus, the regeneration time for all revisions is the same:
651: all headers must be inspected, and the associated blocks either copied
652: or skipped. As the number of revisions increases, the cost of retrieving
653: any revision is much higher than the cost of checking out the
654: latest trunk revision with reverse deltas. A detailed comparison
655: of SCCS's interleaved deltas and RCS's reverse deltas can be found
656: in Reference 4.
657: This reference considers the version of RCS with the
658: stream editor only. The piece table method improves performance
659: further, so that RCS is always faster than SCCS, except if 10
660: or more deltas are applied.
661: .PP
662: Additional speed-up for both delta methods can be obtained by caching
663: the most recently generated revision, as has been implemented in DSEE.\u5\d
664: With caching, access time to frequently used revisions can approach normal file
665: access time, at the cost of some additional space.
666: .NH
667: Locking: A Controversial Issue
668: .PP
669: The locking mechanism for RCS was difficult to design.
670: The problem and its solution are first presented in their `pure' form,
671: followed by a discussion of the complications
672: caused by `real-world' considerations.
673: .PP
674: RCS must prevent two or more persons from depositing competing changes of the
675: same revision.
676: Suppose two programmers check out revision 2.4 and
677: modify it. Programmer A checks in a revision before programmer B.
678: Unfortunately, programmer B has not seen A's
679: changes, so the effect is that A's changes are covered up by B's deposit.
680: A's changes are not lost since all revisions
681: are saved, but they are confined to a single revision\(dd.
682: .FS
683: \(dd Note that this problem is entirely different from the atomicity problem.
684: Atomicity means that
685: concurrent update operations on the same RCS file cannot be permitted,
686: because that may result in inconsistent data.
687: Atomic updates are essential (and implemented in RCS),
688: but do not solve the conflict discussed here.
689: .FE
690: .PP
691: This conflict is prevented in RCS by locking.
692: Whenever someone intends to edit a revision (as opposed
693: to reading or compiling it), the revision should be checked out
694: and locked,
695: using the \fI-l\fR option on \fIco\fR. On subsequent check-in,
696: \fIci\fR tests the lock and then removes it.
697: At most one programmer at a time may
698: lock a particular revision, and only this programmer may check in
699: the succeeding revision.
700: Thus, while a revision is locked, it is the exclusive responsibility
701: of the locker.
702: .PP
703: An important maxim for software tools like RCS is that they must
704: not stand in the way of making progress with a project.
705: This consideration leads to several weakenings of the locking mechanism.
706: First of all, even if a revision is locked, it can
707: still be checked out. This is necessary if other people
708: wish to compile or inspect the locked revision
709: while the next one is in preparation. The only operations they
710: cannot do are to lock the revision or to check in the succeeding one. Secondly,
711: check-in operations on other branches in the RCS file are still possible; the
712: locking of one revision does not affect any other revision.
713: Thirdly, revisions are occasionally locked for a long period of time
714: because a programmer is absent or otherwise unable to complete
715: the assignment. If another programmer has to make a pressing change,
716: there are the following three alternatives for making progress:
717: a) find out who is holding the lock and ask that person to release it;
718: b) check out the locked revision, modify it, check it
719: in on a branch, and merge the changes later;
720: c) break the lock. Breaking a lock leaves a highly visible
721: trace, namely an electronic mail message that is sent automatically to the
722: holder of the lock, recording the breaker and a commentary requested from him.
723: Thus, breaking locks is tolerated under certain circumstances,
724: but will not go unnoticed.
725: Experience has shown that the automatic mail message attaches a high enough
726: stigma to lock breaking,
727: such that programmers break locks only in real emergencies,
728: or when a co-worker resigns and leaves locked revisions behind.
729: .PP
730: If an RCS file is private, i.e., when a programmer owns an RCS file
731: and does not expect anyone else to perform check-in operations,
732: locking is an unnecessary nuisance.
733: In this case,
734: the `strict locking feature' discussed earlier may be disabled,
735: provided that file protection
736: is set such that only the owner may write the RCS file.
737: This has the effect that only the owner can check-in revisions,
738: and that no lock is needed for doing so.
739: .PP
740: As added protection,
741: each RCS file contains an access list that specifies the users
742: who may execute update operations. If an access list is empty,
743: only normal UNIX file protection applies. Thus, the access list is
744: useful for restricting the set of people who would otherwise have update
745: permission. Just as with locking, the access list
746: has no effect on read-only operations such as \fIco\fR. This approach
747: is consistent with the UNIX philosophy of openness, which contributes
748: to a productive software development environment.
749: .NH
750: Configuration Management
751: .PP
752: The preceding sections described how RCS deals with revisions of individual
753: components; this section discusses how to handle configurations.
754: A configuration is a set of revisions, where each revision comes
755: from a different revision group, and the revisions are selected
756: according to a certain criterion.
757: For example,
758: in order to build a functioning compiler, the `right'
759: revisions from the scanner, the parser, the optimizer
760: and the code generator must be combined.
761: RCS, in conjunction with MAKE,
762: provides a number of facilities to effect a smooth selection.
763: .NH 2
764: RCS Selection Functions
765: .PP
766: .IP "\fIDefault selection\fR"
767: .sp 0
768: During development, the usual selection criterion is to choose
769: the latest revision of all components. The \fIco\fR command
770: makes this selection by default. For example, the command
771: .D(
772: co *,v
773: .D)
774: retrieves the latest revision on the default branch of each RCS file
775: in the current directory.
776: The default branch is usually the trunk, but may be
777: set to be a side branch.
778: Side branches as defaults are needed in distributed software development,
779: as discussed in the section on the RCS revision tree.
780:
781: .IP "\fIRelease based selection\fR"
782: .sp 0
783: Specifying a release or branch number selects the latest revision in
784: that release or branch.
785: For instance,
786: .D(
787: co -r2 *,v
788: .D)
789: retrieves the latest revision with release number 2 from each RCS file.
790: This selection is convenient if a release has been completed and
791: development has moved on to the next release.
792:
793: .IP "\fIState and author based selection\fR"
794: .sp 0
795: If the highest level number within a given release number
796: is not the desired one,
797: the state attribute can help. For example,
798: .D(
799: co -r2 -sReleased *,v
800: .D)
801: retrieves the latest revision with release number 2 whose state attribute
802: is `Released'.
803: Of course, the state attribute has to be set appropriately, using the
804: \fIci\fR or \fIrcs\fR commands.
805: Another alternative is to select a revision by its author,
806: using the \fI-w\fR option.
807:
808: .IP "\fIDate based selection\fR"
809: .sp 0
810: Revisions may also be selected by date.
811: Suppose a release of an entire system was
812: completed and current on March 4, at 1:00 p.m. Then the command
813: .D(
814: co -d"March 4, 1:00 pm" *,v
815: .D)
816: checks out all the components of that release, independent of the numbering.
817: The \fI-d\fR option specifies a `cutoff date', i.e.,
818: the revision selected has a check-in date that
819: is closest to, but not after the date given.
820: 208z
821: .IP "\fIName based selection\fR"
822: .sp 0
823: The most powerful selection function is based on assigning symbolic
824: names to revisions and branches.
825: In large systems, a single release number or date is not sufficient
826: to collect the appropriate revisions from all groups.
827: For example, suppose one wishes to combine release 2
828: of one subsystem and release 15 of another.
829: Most likely, the creation dates of those releases differ also.
830: Thus, a single revision number or date passed to the \fIco\fR command
831: will not suffice to select the right revisions.
832: Symbolic revision numbers solve this problem.
833: Each RCS file may contain a set of symbolic names that are mapped
834: to numeric revision numbers. For example, assume
835: the symbol \fIV3\fR is bound to release number 2 in file \fIs,v\fR, and to
836: revision number 15.9 in \fIt,v\fR.
837: Then the single command
838: .D(
839: co -rV3 s,v t,v
840: .D)
841: retrieves the latest revision of release 2 from \fIs,v\fR,
842: and revision 15.9 from \fIt,v\fR.
843: In a large system with many modules, checking out all
844: revisions with one command greatly simplifies configuration management.
845: .PP
846: Judicious use of symbolic revision numbers helps with organizing
847: large configurations.
848: A special command, \fIrcsfreeze\fR,
849: assigns a symbolic revision number to a selected revision
850: in every RCS file.
851: \fIRcsfreeze\fR effectively freezes a configuration.
852: The assigned symbolic revision number selects all components
853: of the configuration.
854: If necessary, symbolic numbers
855: may even be intermixed with numeric ones. Thus, \fIV3.5\fR in the
856: above example
857: would select revision 2.5 in \fIs,v\fR and branch 15.9.5 in \fIt,v\fR.
858: .PP
859: The options \fI-r\fR, \fI-s\fR, \fI-w\fR and \fI-d\fR
860: may be combined. If a branch is given, the latest revision
861: on that branch satisfying all conditions is retrieved;
862: otherwise, the default branch is used.
863: .NH 2
864: Combining MAKE and RCS
865: .PP
866: MAKE\u1\d
867: is a program that processes configurations.
868: It is driven by configuration specifications
869: recorded in a special file, called a `Makefile'.
870: MAKE avoids redundant processing steps
871: by comparing creation dates of source and processed objects.
872: For example, when instructed to compile all
873: modules of a given system, it only recompiles
874: those source modules that were changed
875: since they were processed last.
876: .PP
877: MAKE has been extended with an auto-checkout feature for RCS.
878: When a certain file to be processed is not present,
879: MAKE attempts a check-out operation.
880: If successful, MAKE performs the required processing, and then deletes
881: the checked out file to conserve space.
882: The selection parameters discussed above can be passed to MAKE
883: either as parameters, or directly embedded in the Makefile.
884: MAKE has also been extended to search the subdirectory named \fIRCS\fR
885: for needed files, rather than just the current working directory.
886: However, if a working file is present, MAKE totally ignores the corresponding
887: RCS file and uses the working file.
888: (In newer versions of MAKE distributed by AT&T and others,
889: auto-checkout can be
890: achieved with the rule DEFAULT, instead of a special extension of MAKE.
891: However, a file checked out by the rule DEFAULT
892: will not be deleted after processing. \fIRcsclean\fR can be
893: used for that purpose.)
894: .PP
895: With auto-checkout, RCS/MAKE can effect a selection rule
896: especially tuned for multi-person software development and maintenance.
897: In these situations,
898: programmers should obtain configurations that consist of
899: the revisions they have personally checked out plus the latest
900: checked in revision of all other revision groups.
901: This schema can be set up as follows.
902: .PP
903: Each programmer chooses a working directory
904: and places into it a symbolic link, named \fIRCS\fR,
905: to the directory containing the relevant RCS files.
906: The symbolic link makes sure that \fIco\fR and \fIci\fR
907: operations need only specify the working files, and that
908: the Makefile need not be changed.
909: The programmer then checks out the needed files and modifies them.
910: If MAKE is invoked,
911: it composes configurations by selecting those
912: revisions that are checked out, and the rest from the
913: subdirectory \fIRCS\fR.
914: The latter selection may be controlled by a symbolic
915: revision number or any of the other selection criteria.
916: If there are several programmers editing in separate working directories,
917: they are insulated from each other's changes until checking in their
918: modifications.
919: .PP
920: Similarly, a maintainer can recreate an older configuration
921: by starting to work in an empty working directory.
922: During the initial MAKE invocation, all revisions are selected from RCS files.
923: As the maintainer checks out files and modifies them,
924: a new configuration is gradually built up.
925: Every time MAKE is invoked, it substitutes the modified revisions
926: into the configuration being manipulated.
927: .PP
928: A final application of RCS is to use it for storing Makefiles.
929: Revision groups of Makefiles represent
930: multiple versions of configurations.
931: Whenever a configuration is baselined or distributed,
932: the best approach is to unambiguously fix
933: the configuration with a symbolic revision number by calling
934: \fIrcsfreeze\fR,
935: to embed that symbol into the Makefile, and to
936: check in the Makefile (using the same symbolic revision number).
937: With this approach, old configurations
938: can be regenerated easily and reliably.
939: .NH
940: Usage Statistics
941: .PP
942: The following usage statistics were collected on two DEC VAX-11/780
943: computers of the Purdue Computer Science Department. Both machines
944: are mainly used for research purposes. Thus, the data
945: reflect an environment in which the majority of projects
946: involve prototyping and advanced software development,
947: but relatively little long-term maintenance.
948: .PP
949: For the first experiment,
950: the \fIci\fR and \fIco\fR operations were instrumented
951: to log the number of backward and forward deltas applied.
952: The data were collected during a 13 month period
953: from Dec. 1982 to Dec. 1983.
954: Table I summarizes the results.
955: .sp 0
956: .nr VS 12pts
957: .vs 12pts
958: .TS
959: center,box,tab(#);
960: c|c|c|c|c s|c s
961: c|c|c|c|c s|c s
962: l|n|n|n|n n|n n.
963: Operation#Total#Total deltas#Mean deltas#Operations#Branch
964: #operations #applied#applied#with >1 delta#operations
965: _
966: co # 7867# 9320#1.18#509#(6%)#203#(3%)
967: ci # 3468# 2207#0.64# 85#(2%)# 75#(2%)
968: ci & co#11335#11527#1.02#594#(5%)#278#(2%)
969: .TE
970: .ce 1
971: Table I. Statistics for \fIco\fR and \fIci\fR operations.
972: .nr VS 18pts
973: .vs 18pts
974: .PP
975: The first two lines show statistics for check-out and check-in;
976: the third line shows the combination.
977: Recall that \fIci\fR performs an implicit check-out to obtain
978: a revision for computing the delta.
979: In all measures presented, the most recent revision (stored intact)
980: counts as one delta. The number of deltas applied represents
981: the number of passes necessary, where the first `pass' is a copying step.
982: .PP
983: Note that the check-out operation is executed more than
984: twice as frequently as the check-in operation.
985: The fourth column gives the mean number of deltas
986: applied in all three cases.
987: For \fIci\fR, the mean number of deltas applied is less
988: than one.
989: The reasons are that the initial check-in requires no delta at all, and that
990: the only time \fIci\fR requires more than one delta is for branches.
991: Column 5 shows the actual number of operations that applied more than one
992: delta.
993: The last column indicates that branches were not used often.
994: .PP
995: The last three columns demonstrate that the most recent trunk revision
996: is by far the most frequently accessed.
997: For RCS, check-out of
998: this revision is a simple copy operation, which is the absolute minimum
999: given the copy-semantics of \fIco\fR.
1000: Access to older revisions and branches
1001: is more common in non-academic environments,
1002: yet even if access to older deltas were an order
1003: of magnitude more frequent,
1004: the combined average number of deltas applied would still be below 1.2.
1005: Since RCS is faster than SCCS until up to 10 delta applications,
1006: reverse deltas are clearly the method of choice.
1007: .PP
1008: The second experiment, conducted in March of 1984,
1009: involved surveying the existing RCS files
1010: on our two machines. The goal was to determine the mean number of
1011: revisions per RCS file, as well as the space consumed by them.
1012: Table II shows the results. (Tables I and II were produced at different
1013: times and are unrelated.)
1014: .sp 0
1015: .nr VS 12pts
1016: .vs 12pts
1017: .TS
1018: center,box,tab(#);
1019: c | c | c | c | c | c | c
1020: c | c | c | c | c | c | c
1021: l | n | n | n | n | n | n
1022: .
1023: #Total RCS#Total#Mean#Mean size of#Mean size of#Overhead
1024: #files#revisions#revisions#RCS files#revisions
1025: _
1026: All files #8033#11133#1.39#6156#5585#1.10
1027: Files with#1477# 4578#3.10#8074#6041#1.34
1028: \(>= 2 deltas
1029: .TE
1030: .ce 1
1031: Table II. Statistics for RCS files.
1032: .nr VS 18pts
1033: .vs 18pts
1034: .PP
1035: The mean number of revisions per RCS file is 1.39.
1036: Columns 5 and 6 show the mean sizes (in bytes) of an RCS file
1037: and of the latest revision of each RCS file, respectively.
1038: The `overhead' column contains the ratio of the mean sizes.
1039: Assuming that all revisions in an RCS file are approximately the same size,
1040: this ratio gives a measure of the space consumed by the extra revisions.
1041: .PP
1042: In our sample, over 80 per cent of the RCS files contained only a single revision.
1043: The reason is that our
1044: systems programmers routinely check in all source files
1045: on the distribution tapes, even though they may never touch them again.
1046: To get a better indication of how much space savings are possible
1047: with deltas, all measures with those files
1048: that contained 2 or more revisions were recomputed. Only for those files
1049: is RCS necessary.
1050: As shown in the second line, the average number of revisions for those files is
1051: 3.10, with an overhead of 1.34. This means that the extra 2.10 deltas
1052: require 34 per cent extra space, or
1053: 16 per cent per extra revision.
1054: Rochkind\u3\d
1055: measured the space consumed by SCCS, and
1056: reported an average of 5 revisions per group
1057: and an overhead of 1.37 (or about 9 per cent per extra revision).
1058: In a later paper, Glasser\u6\d
1059: observed an average of 7 revisions per group in a single, large project,
1060: but provided no overhead figure.
1061: In his paper on DSEE\u5\d,
1062: Leblang reported that delta storage combined with blank compression
1063: results in an overhead of a mere 1\-2 per cent per revision.
1064: Since leading blanks accounted for about 20 per cent of the surveyed Pascal
1065: programs, a revision group with 5\-10 members was smaller
1066: than a single cleartext copy.
1067: .PP
1068: The above observations demonstrate clearly that the space needed
1069: for extra revisions is small. With delta storage, the luxury of
1070: keeping multiple revisions online is certainly affordable.
1071: In fact, introducing a system with delta storage may reduce
1072: storage requirements, because programmers often save back-up copies
1073: anyway. Since back-up copies are stored much more efficiently with deltas,
1074: introducing a system such as RCS may
1075: actually free a considerable amount of space.
1076: .NH
1077: Survey of Version Control Tools
1078: .PP
1079: The need to keep back-up copies of software arose when
1080: programs and data were no longer stored on paper media, but were entered
1081: from terminals and stored on disk.
1082: Back-up copies are desirable for reliability, and many modern editors
1083: automatically save a back-up copy for every file touched.
1084: This strategy
1085: is valuable for short-term back-ups, but not suitable for long-term
1086: version control, since an existing back-up copy is overwritten whenever the
1087: corresponding file is edited.
1088: .PP
1089: Tape archives are suitable for long-term, offline storage.
1090: If all changed files are dumped on a back-up tape once per day, old revisions
1091: remain accessible. However, tape archives are unsatisfactory
1092: for version control in several ways. First, backing up the file
1093: system every 24 hours does not capture intermediate revisions.
1094: Secondly, the old revisions are not online,
1095: and accessing them is tedious and time-consuming.
1096: In particular, it is impractical to
1097: compare several old revisions of a group,
1098: because that may require mounting and searching several tapes.
1099: Tape archives are important fail-safe tools in the
1100: event of catastrophic disk failures or accidental deletions,
1101: but they are ill-suited for version control.
1102: Conversely, version control tools do not obviate the
1103: need for tape archives.
1104: .PP
1105: A natural technique for keeping several old revisions online is
1106: to never delete a file.
1107: Editing a file
1108: simply creates a new file with the same
1109: name, but with a different sequence number.
1110: This technique, available as an option in DEC's VMS operating system,
1111: turns out to be inadequate for version control.
1112: First, it is prohibitively expensive in terms of storage costs,
1113: especially since no data compression techniques are employed.
1114: Secondly, indiscriminately storing every change produces too many
1115: revisions, and programmers have difficulties distinguishing them.
1116: The proliferation of revisions forces programmers to spend much time on
1117: finding and deleting useless files.
1118: Thirdly, most of the support functions like locking, logging,
1119: revision selection,
1120: and identification described in this paper are not available.
1121: .PP
1122: An alternative approach is to separate editing from revision control.
1123: The user may repeatedly edit a given revision,
1124: until freezing it with an explicit command.
1125: Once a revision is frozen, it is stored permanently and can no longer be modified.
1126: (In RCS, freezing a revisions is done with \fIci\fR.)
1127: Editing a frozen revision implicitly creates a new one, which
1128: can again be changed repeatedly until it is frozen itself.
1129: This approach saves exactly those revisions that the user
1130: considers important, and keeps the number of revisions manageable.
1131: IBM's CLEAR/CASTER\u7\d,
1132: AT&T's SCCS\u3\d,
1133: CMU's SDC\u8\d
1134: and DEC's CMS\u9\d,
1135: are examples of version control systems using this approach.
1136: CLEAR/CASTER maintains a data base of programs, specifications,
1137: documentation and messages, using deltas.
1138: Its goal is to provide control over the development process from a
1139: management viewpoint.
1140: SCCS stores multiple revisions of source text in an ancestral tree,
1141: records a log entry for each revision,
1142: provides access control, and has facilities
1143: for uniquely identifying each revision.
1144: An efficient delta technique
1145: reduces the space consumed by each revision group.
1146: SDC is much simpler than SCCS because it stores not more than
1147: two revisions. However, it maintains a complete log for all old
1148: revisions, some of which may be on back-up tape.
1149: CMS, like SCCS, manages tree-structured revision groups,
1150: but offers no identification mechanism.
1151: .PP
1152: Tools for dealing with configurations are still in a state of flux.
1153: SCCS, SDC and CMS can be combined with MAKE or MAKE-like programs.
1154: Since flexible selection rules are missing from all these tools,
1155: it is sometimes difficult
1156: to specify precisely which revision of each group
1157: should be passed to MAKE for building a desired configuration.
1158: The Xerox Cedar system\u10\d
1159: provides a `System Modeller' that can rebuild
1160: a configuration from an arbitrary set of module revisions.
1161: The revisions of a module are only distinguished by creation time,
1162: and there is no tool for managing groups.
1163: Since the selection rules are primitive,
1164: the System Modeller appears to be somewhat tedious to use.
1165: Apollo's DSEE\u5\d
1166: is a sophisticated software engineering environment.
1167: It manages revision groups in a way similar to SCCS and CMS. Configurations
1168: are built using `configuration threads'.
1169: A configuration thread states which revision of each group
1170: named in a configuration should be chosen.
1171: A configuration thread may contain dynamic specifiers
1172: (e.g., `choose the revisions I am currently working on,
1173: and the most recent revisions otherwise'), which are bound
1174: automatically at build time.
1175: It also provides a notification mechanism for alerting
1176: maintainers about the need to rebuild a system after a change.
1177: .PP
1178: RCS is based on a general model for describing
1179: multi-version/multi-configuration systems\u11\d.
1180: The model describes systems using AND/OR graphs, where AND nodes represent
1181: configurations, and OR nodes represent version groups.
1182: The model gives rise to a suit of selection rules for
1183: composing configurations, almost all of which are implemented in RCS.
1184: The revisions selected by RCS are passed to MAKE for configuration building.
1185: Revision group management is modelled after SCCS.
1186: RCS retains SCCS's best features,
1187: but offers a significantly simpler user interface,
1188: flexible selection rules, adequate integration with MAKE
1189: and improved identification.
1190: A detailed comparison of RCS and SCCS appears in Reference 4.
1191: .PP
1192: An important component of all revision control systems
1193: is a program for computing deltas.
1194: SCCS and RCS use the program \fIdiff\fR\u2\d,
1195: which first computes the longest common substring of two
1196: revisions, and then produces the delta from that substring.
1197: The delta is simply an edit script consisting of deletion and
1198: insertion commands that generate one revision from the other.
1199: .PP
1200: A delta based on a longest common substring is not necessarily minimal,
1201: because it does not take advantage of crossing block moves.
1202: Crossing block moves arise if two or more blocks of lines
1203: (e.g., procedures)
1204: appear in a different order in two revisions.
1205: An edit script derived from a longest common substring
1206: first deletes the shorter of the two blocks, and then reinserts it.
1207: Heckel\u12\d
1208: proposed an algorithm for detecting block moves, but
1209: since the algorithm is based on heuristics,
1210: there are conditions
1211: under which the generated delta is far from minimal.
1212: DSEE uses this algorithm combined with blank compression,
1213: apparently with satisfactory overall results.
1214: A new algorithm that is guaranteed to produce a minimal delta based on
1215: block moves appears in Reference 13.
1216: A future release of RCS will use this algorithm.
1217: .PP
1218: \fIAcknowledgements\fR:
1219: Many people have helped make RCS a success by contributed criticisms, suggestions,
1220: corrections, and even whole new commands (including manual pages).
1221: The list of people is too long to be
1222: reproduced here, but my sincere thanks for their help and
1223: goodwill goes to all of them.
1224:
1225: .nr VS 12 pts
1226: .vs 12pts
1227: .SH
1228: Appendix: Synopsis of RCS Operations
1229: .LP
1230: .IP "\fIci \fB\- check in revisions\fR"
1231: .sp 0
1232: \fICi\fR stores the contents of a working file into the
1233: corresponding RCS file as a new revision.
1234: If the RCS file doesn't exist, \fIci\fR creates it.
1235: \fICi\fR removes the working file, unless one of the options
1236: \fI-u\fR or \fI-l\fR is present.
1237: For each check-in, \fIci\fR asks for a commentary
1238: describing the changes relative to the previous revision.
1239: .sp 1
1240: \fICi\fR assigns the revision number given by the \fI-r\fR option;
1241: if that option is missing, it derives the number from the
1242: lock held by the user; if there is no lock and locking is not strict,
1243: \fIci\fR increments the number of the latest revision on the trunk.
1244: A side branch can only be started by explicitly specifying its
1245: number with the \fI-r\fR option during check-in.
1246: .sp 1
1247: \fICi\fR also determines
1248: whether the revision to be checked in is different from the
1249: previous one, and asks whether to proceed if not.
1250: This facility simplifies check-in operations for large systems,
1251: because one need not remember which files were changed.
1252: .sp 1
1253: The option \fI-k\fR searches the checked in file for identification
1254: markers containing
1255: the attributes
1256: revision number, check-in date, author and state, and assigns these
1257: to the new revision rather than computing them. This option is
1258: useful for software distribution: Recipients of distributed software
1259: using RCS should check in updates with the \fI-k\fR option.
1260: This convention guarantees that revision numbers, check-in dates,
1261: etc., are the same at all sites.
1262: .IP "\fIco \fB\- check out revisions\fR"
1263: .sp 0
1264: \fICo\fR retrieves revisions according to revision number,
1265: date, author and state attributes. It either places the revision
1266: into the working file, or prints it on the std. output.
1267: \fICo\fR always expands the identification markers.
1268: .IP "\fIident \fB\- extract identification markers\fR"
1269: .sp 0
1270: \fIIdent\fR extracts the identification markers expanded by \fIco\fR
1271: from any file and prints them.
1272: .IP "\fIrcs \fB\- change RCS file attributes\fR"
1273: .sp 0
1274: \fIRcs\fR is an administrative operation that changes access lists,
1275: locks, unlocks, breaks locks, toggles the strict-locking feature,
1276: sets state attributes and symbolic revision numbers, changes the
1277: description, and deletes revisions. A revision can
1278: only be deleted if it is not the fork of a side branch.
1279: .IP "\fIrcsclean \fB\- clean working directory\fR"
1280: .sp 0
1281: \fIRcsclean\fR removes working files that were checked out but never changed.
1282: .IP "\fIrcsdiff \fB\- compare revisions\fR"
1283: .sp 0
1284: \fIRcsdiff\fR compares two revisions and prints their
1285: difference, using the UNIX tool \fIdiff\fR.
1286: One of the revisions compared may be checked out.
1287: This command is useful for finding out about changes.
1288: .IP "\fIrcsfreeze \fB\- freeze a configuration\fR"
1289: .sp 0
1290: \fIRcsfreeze\fR assigns the same symbolic revision number
1291: to a given revision in all RCS files.
1292: This command is useful for accurately recording a configuration.
1293: .IP "\fIrcsmerge \fB\- merge revisions\fR"
1294: .sp 0
1295: \fIRcsmerge\fR merges two revisions, \fIrev1\fR and \fIrev2\fR,
1296: with respect to a common ancestor.
1297: A 3-way file comparison determines the segments of lines that
1298: are (a) the same in all three revisions, or (b) the same in 2 revisions,
1299: or (c) different in all three. For all segments of type (b) where
1300: \fIrev1\fR is the differing revision,
1301: the segment in \fIrev1\fR replaces the corresponding segment of \fIrev2\fR.
1302: Type (c) indicates an overlapping change, is flagged as an error, and requires user
1303: intervention to select the correct alternative.
1304: .IP "\fIrlog \fB\- read log messages\fR"
1305: .sp 0
1306: \fIRlog\fR prints the log messages and other information in an RCS file.
1307: .bp
1308: .LP
1309: .nr VS 12 pts
1310: .vs 12pts
1311: .]<
1312: .ds [F 1
1313: .]-
1314: .ds [K FELD02
1315: .ds [K MakeArticle
1316: .ds [A Feldman, Stuart I.
1317: .ds [D March 1979
1318: .ds [T Make - A Program for Maintaining Computer Programs
1319: .ds [J Software -- Practice and Experience
1320: .ds [V 9
1321: .ds [N 3
1322: .ds [P 255-265
1323: .nr [P 1
1324: .nr [T 0
1325: .nr [A 1
1326: .nr [O 0
1327: .][ 1 journal-article
1328: .ds [F 2
1329: .]-
1330: .ds [K HUNT01
1331: .ds [T An Algorithm for Differential File Comparison
1332: .ds [A Hunt, James W.
1333: .as [A " and McIlroy, M. D.
1334: .ds [I Computing Science Technical Report, Bell Laboratories
1335: .ds [R 41
1336: .ds [D June 1976
1337: .nr [T 0
1338: .nr [A 1
1339: .nr [O 0
1340: .][ 4 tech-report
1341: .ds [F 3
1342: .]-
1343: .ds [K SCCS
1344: .ds [A Rochkind, Marc J.
1345: .ds [D Dec. 1975
1346: .ds [T The Source Code Control System
1347: .ds [J IEEE Transactions on Software Engineering
1348: .ds [V SE-1
1349: .ds [N 4
1350: .ds [P 364-370
1351: .nr [P 1
1352: .nr [T 0
1353: .nr [A 1
1354: .nr [O 0
1355: .][ 1 journal-article
1356: .ds [F 4
1357: .]-
1358: .ds [K TICH08
1359: .ds [T Design, Implementation, and Evaluation of a Revision Control System
1360: .ds [A Tichy, Walter F.
1361: .ds [B Proceedings of the 6th International Conference on Software Engineering
1362: .ds [I ACM, IEEE, IPS, NBS
1363: .ds [D September 1982
1364: .ds [P 58-67
1365: .nr [P 1
1366: .nr [T 0
1367: .nr [A 1
1368: .nr [O 0
1369: .][ 3 article-in-book
1370: .ds [F 5
1371: .]-
1372: .ds [K LEBL01
1373: .ds [A Leblang, David B.
1374: .as [A " and Chase, Robert P.
1375: .ds [T Computer-Aided Software Engineering in a Distributed Workstation Environment
1376: .ds [O Proceedings of the ACM SIGSOFT/SIGPLAN Software Engineering Symposium
1377: .as [O " on Practical Software Development Environments.
1378: .ds [J SIGPLAN Notices
1379: .ds [V 19
1380: .ds [N 5
1381: .ds [D May 1984
1382: .ds [P 104-112
1383: .nr [P 1
1384: .nr [T 0
1385: .nr [A 1
1386: .nr [O 0
1387: .][ 1 journal-article
1388: .ds [F 1
1389: .ds [F 3
1390: .ds [F 6
1391: .]-
1392: .ds [K SCCSEval
1393: .ds [A Glasser, Alan L.
1394: .ds [D Nov. 1978
1395: .ds [T The Evolution of a Source Code Control System
1396: .ds [J Software Engineering Notes
1397: .ds [V 3
1398: .ds [N 5
1399: .ds [P 122-125
1400: .nr [P 1
1401: .ds [O Proceedings of the Software Quality and Assurance Workshop.
1402: .nr [T 0
1403: .nr [A 1
1404: .nr [O 1
1405: .][ 1 journal-article
1406: .ds [F 5
1407: .ds [F 7
1408: .]-
1409: .ds [K IBMClearCaster
1410: .ds [A Brown, H.B.
1411: .ds [D 1970
1412: .ds [T The Clear/Caster System
1413: .ds [J Nato Conference on Software Engineering, Rome
1414: .nr [T 0
1415: .nr [A 1
1416: .nr [O 0
1417: .][ 1 journal-article
1418: .ds [F 3
1419: .ds [F 8
1420: .]-
1421: .ds [K HabermannSDC
1422: .ds [A Habermann, A. Nico
1423: .ds [D Jan. 1979
1424: .ds [T A Software Development Control System
1425: .ds [I Technical Report, Carnegie-Mellon University, Department of Computer Science
1426: .nr [T 0
1427: .nr [A 0
1428: .nr [O 0
1429: .][ 2 book
1430: .ds [F 9
1431: .]-
1432: .ds [K CMS
1433: .ds [A DEC,
1434: .ds [T Code Management System
1435: .ds [I Digital Equipment Corporation
1436: .ds [O Document No. EA-23134-82
1437: .ds [D 1982
1438: .nr [T 0
1439: .nr [A 0
1440: .nr [O 0
1441: .][ 2 book
1442: .ds [F 10
1443: .]-
1444: .ds [K LAMP01
1445: .ds [A Lampson, Butler W.
1446: .as [A " and Schmidt, Eric E.
1447: .ds [T Practical Use of a Polymorphic Applicative Language
1448: .ds [B Proceedings of the 10th Symposium on Principles of Programming Languages
1449: .ds [I ACM
1450: .ds [P 237-255
1451: .nr [P 1
1452: .ds [D January 1983
1453: .nr [T 0
1454: .nr [A 1
1455: .nr [O 0
1456: .][ 3 article-in-book
1457: .ds [F 5
1458: .ds [F 11
1459: .]-
1460: .ds [K TICH07
1461: .ds [T A Data Model for Programming Support Environments and its Application
1462: .ds [A Tichy, Walter F.
1463: .ds [B Automated Tools for Information System Design and Development
1464: .ds [E Hans-Jochen Schneider and Anthony I. Wasserman
1465: .ds [C Amsterdam
1466: .ds [I North-Holland Publishing Company
1467: .ds [D 1982
1468: .nr [T 0
1469: .nr [A 1
1470: .nr [O 0
1471: .][ 3 article-in-book
1472: .ds [F 4
1473: .ds [F 2
1474: .ds [F 12
1475: .]-
1476: .ds [K HECK01
1477: .ds [T A Technique for Isolating Differences Between Files
1478: .ds [A Heckel, Paul
1479: .ds [J Communications of the ACM
1480: .ds [D April 1978
1481: .ds [V 21
1482: .ds [N 4
1483: .ds [P 264-268
1484: .nr [P 1
1485: .nr [T 0
1486: .nr [A 0
1487: .nr [O 0
1488: .][ 1 journal-article
1489: .ds [F 13
1490: .]-
1491: .ds [K TICH11
1492: .ds [T The String-to-String Correction Problem with Block Moves
1493: .ds [A Tichy, Walter F.
1494: .ds [D Nov. 1984
1495: .ds [J ACM Transactions on Computer Systems
1496: .ds [V 2
1497: .ds [N 4
1498: .ds [P 309-321
1499: .nr [P 1
1500: .nr [T 0
1501: .nr [A 1
1502: .nr [O 0
1503: .][ 1 journal-article
1504: .]>
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.