FAQ revision 66525
1This file contains a CVS FAQ.  Until 1995 it was maintained by David
2Grubbs.  It was out of date and not being maintained, but it had a
3certain following and in 1997 Pascal Molli decided to start
4maintaining it with the FAQ-O-Matic package which allows any
5contributor with a web browser to help maintain it.  The following
6text is (mostly automatically) extracted from the FAQ-O-Matic.  The
7odds are good that the file that you are currently reading is out of
8date with respect to the online FAQ-O-Matic, which is part of Pascal
9Molli's CVS web site at http://www.loria.fr/~molli/cvs-index.html
10(currently under "Documentation").  The online version is also
11somewhat better in terms of things like tables of contents (at least
12until someone can write some code to extract data from a FAQ-O-Matic
13and insert things like tables of contents).
14
15The answers which are dated "6/13/1997" below are really from the 1995
16FAQ, for the most part.  Many of them are out of date.  If you have
17some time, you are encouraged to double-check them against other
18sources like the Cederqvist manual and update the FAQ.  If you don't
19have such time, take them with a grain of salt or a few.
20
21Since Feb. 2000 CVS is being maintained by OpenAvenue, Inc. and many of
22the existing resources have been centeralized on http://www.cvshome.org.
23
24  Category: /, all questions
25  
26  Category: /
27  
28          " [INLINE] "
29          
30    1. About FAQ-O-Matic 
31    
32This is FAQ-O-Matic, a quick-and-dirty Perl hack (aren't they all?) by
33Jon Howell.
34
35It seems like most FAQ maintainers make a valiant initial effort, then get
36a life and don't have time to keep their FAQs up to date. Also, I often
37find out a solution to a problem, and feel like I could write a single
38FAQ answer on it in a few minutes, but where to post it?
39
40Thus the FAQ-O-Matic was born. FAQ-O-Matic is a couple sleazy Perl scripts
41that allow people to submit FAQ answers to this database, so it can stay
42current, with just a tiny bit of work on any one person's part.
43
44Yes, a bad guy could come along and wipe out all the FAQ entries. Please don't.
45But to give the good guys some measure of comfort, each submission is stored
46in an RCS file, so if someone does tamper, we can recover the database.
47
48Guidelines for submissions:
49
501. Please _try to be fairly unbiased in matters of opinion._ Mailing lists are
51the place to start flame wars (just kidding :v), but definitely not here.
52
532. Please _use HTML only conservatively_ in your entries. Links are appropriate
54,
55but put the URL in the plaintext also so it's useable on printed versions of
56the FAQ. Inline images pointing off this site are inappropriate, as is much
57fancy formatting. This is meant to be bandwidth-light and dumb-browser-friendly
58.
59
603. If you feel there's a place for a _new category, or a reorganization of
61existing questions_, don't hesitate to mail me (molli@loria.fr).
62Category changes need to be done from my end.
63
644. Please _leave an email address_ at the bottom of your submission so that oth
65ers
66can drop you a note.
67
685. _If you only have a question_, not an answer, you should probably post
69it to a mailing list, not here. If there are frequently asked questions to whic
70h
71the answer is not forthcoming on mailing lists (or perhaps there's no
72useful answer yet other than "no one knows"), then it's appropriate to
73post here, in hopes that someone will see it and know the answer.
74
756. Please refrain from crude or inconsiderate language. Please don't use
76this as a forum for advertising. However, mention of worthy commercial
77products is certainly appropriate (even if you sell said product). Just
78don't overdo it. :v)
79
80          Last modified: _6/13/1997_
81          
82    2. Adding a new category ? 
83    
84just send me a mail at
85molli@loria.fr
86
87          Last modified: _6/13/1997_
88          
89  Category: /Advanced_Topics_/
90  
91          " Advanced Topics "
92          
93  Category: /Advanced_Topics_/Branching_and_Mergin/
94  
95          " + Branching and Merging"
96          
97    1. What is a branch? 
98    
99          Unfortunately, the word "branch" is an overloaded technical
100          term. It is used in too many different ways in three
101          categories. It might help to understand some of the issues by
102          going through the categories:
103          
104     How Humans use the word "branch":
105          
106          Most development starts with everyone working on the same
107          software, making changes and heading toward a single goal. This
108          is called something like "Main Line Development". Note that
109          though many people do main line development on CVS's "Main
110          Branch", that is a choice, not a requirement.
111          
112          After a release or when one or more developers want to go off
113          and work on some project for a while, the Software Engineers
114          assigned to deal with large software issues generate a "Branch
115          in Development" to support the release or project. (Keep in
116          mind that a programmer is no more a Software Engineer than a
117          carpenter is a Civil Engineer.)
118          
119          Essentially, the word "branch" implies a way to allow
120          simultaneous development on the same files by multiple people.
121          
122          The above terms are human-oriented. They refer to actions that
123          people would like to take. They do *not* imply any particular
124          implementation or set of procedures. Branches in development
125          can be supported in many different ways.
126          
127     How CVS uses the word "branch":
128          
129          CVS uses the word "branch" in a number of ways. The two most
130          important are:
131          
132          - The vendor branch holds releases from (normally) an outside
133          software vendor. It is implemented using a specific RCS branch
134          (i.e. 1.1.1).
135          
136          - The "Main Branch", which normally holds your "Main Line
137          Development", but is defined as the collection of revisions you
138          get when you "checkout" something fresh, or when you use the
139          '-A' option to "update".
140          
141          Important Note: The CVS "Main Branch" is *not* the same as the
142          RCS concept with the same name. If you are using Vendor
143          Branches, files you have never changed are on three branches at
144          the same time:
145          
146          - The RCS 1.1.1 branch.
147          - The CVS Vendor branch.
148          - The CVS "Main Branch".
149          
150          The concepts overlap, but they are not equivalent.
151          
152          In referring to CVS, "branch" can be used in four other ways:
153          
154          - A CVS working directory satisfies the definition of "branch"
155          for a single developer -- you are on a private "virtual branch"
156          that does not appear in any of the RCS files or the CVS control
157          files.
158          
159          - The CVS "default branch" is the Repository source for the
160          collection of files in your working directory. It is *not* the
161          same as the RCS "default branch". Normally the CVS default
162          branch is the same as the CVS Main branch. If you use the "-r
163          <branch_tag>" option to the "checkout" command, you will record
164          a "sticky" tag that changes your default branch to the one you
165          checked out.
166          
167          - A "magic" branch can be a branch that hasn't happened yet. It
168          is implemented by a special tag you can check out that is not
169          attached to a real RCS branch. When you commit a file to a
170          magic branch, the branch becomes real (i.e. a physical RCS
171          branch).
172          
173          - And, of course, CVS uses "branch" to indicate a
174          human-oriented "branch in development".
175          
176     How RCS uses the word "branch":
177          
178          - The RCS "Main Branch" (Synonym: "The Trunk") contains a
179          series of two-part revision numbers separated by a single '.'
180          (e.g. 1.2). It is treated specially and is the initial default
181          branch. (The default default?)
182          
183          - The RCS "Default" branch starts out attached to the RCS "Main
184          Branch". For RCS purposes, it can be changed to point to any
185          branch. Within CVS, you *must*not* alter the RCS default
186          branch. It is used to support the CVS idea of a "Main Branch"
187          and it must either point to the RCS Main Branch, or the Vendor
188          Branch (1.1.1) if you haven't made any changes to the file
189          since you executed "import".
190          
191   Last modified: _6/13/1997_
192   
193    2. Why (or when) would I want to create a branch? 
194    
195   Remember that you can think of your working directory as a "branch for
196   one". You can consider yourself to be on a branch all the time because
197   you can work without interfering with others until your project (big
198   or small) is done.
199   
200   The four major situations when you should create a branch:
201   
202     When you expect to take a long time or make a large set of changes
203   that the merging process will be difficult. Both "long" and "large"
204   are defined in your own environment.
205   
206     When you want to be able to "commit" and "tag" your work repeatedly
207   without affecting others.
208   
209   If you ever think you need Source Control for your own work, but don't
210   want your changes to affect others, create a private branch. (Put your
211   username in the branch tag, to make it obvious that it is private.)
212   
213     When you need to share code among a group of developers, but not the
214   whole development organization working on the files.
215   
216   Rather than trying to share a working directory, you can move onto a
217   branch and share your work with others by "committing" your work onto
218   the branch. Developers not working on the branch won't see your work
219   unless they switch to your branch or explicitly merge your branch into
220   theirs.
221   
222     When you need to make minor changes to a released system.
223   
224   Normally a "release" is labeled by a branch tag, allowing later work
225   on the released files. If the release is labeled by a non-branch tag,
226   it is easy to add a branch tag to a previously tagged module with the
227   "rtag" command. If the release is not tagged, you made a mistake.
228   Recovery requires identifying all revisions involved in the release
229   and adding a tag to them.
230   
231   Last modified: _6/13/1997_
232   
233    3. How do I create and checkout a branch? 
234    
235   Suggested technique:
236   
237     Attach a non-branch tag to all the revisions you want to branch
238   from. (i.e. the branch point revisions)
239   
240     When you decide you really need a branch, attach a branch tag to the
241   same revisions marked by the non-branch tag.
242   
243     "Checkout" or "update" your working directory onto the branch.
244   
245     Suggested procedure when using modules:
246   
247     cvs rtag <branch_point_tag> module
248   
249     cvs rtag -b -r <branch_point_tag> <branch_tag> <module>
250   
251     cvs checkout -r <branch_tag> module
252   
253     Suggested procedure when using your working directory, which
254   contains the revisions of your working files you want to branch from:
255   
256     cvs tag <branch_point_tag>
257   
258     cvs rtag -b -r <branch_point_tag> <branch_tag> <module>
259   
260     cvs update -r <branch_tag>
261   
262   In each procedure above, Step #1 applies a non-branch tag to all the
263   branch point revisions in the module/directory. Though this is not
264   strictly necessary, if you don't add a non-branch tag to the revisions
265   you branch from, you won't be able to refer to the branch point in the
266   future.
267   
268   Between steps 1 & 2 you may commit changes. The result would be same
269   because "rtag -r <oldtag> <newtag>" applies <newtag> to the same
270   revision that <oldtag> is attached to. You can use this technique to
271   avoid attaching *any* branch tags until you need them.
272   
273   Step B.2 has two corollaries:
274   
275     If you plan to create the branch tag before committing anything in
276   your working directory, you can use "cvs tag -b <branch_tag>" instead
277   of the "rtag" command.
278   
279     The <module> can be a relative path to a directory from which your
280   working directory was checked out.
281   
282   If you have trouble figuring out what <module> to use (or pathname to
283   use in its place), you can aim it at whatever parent directories you
284   believe will cover all your work.
285   
286   If you are sure the <branch_tag> is not being used anywhere else, you
287   can even aim it at the whole Repository ($CVSROOT), if you have to. It
288   might take some extra time, but assuming that your <tag> is a unique
289   string and you don't use the '-f' option to "rtag -r", "rtag" will
290   only add a <tag> to files in which it actually *finds* the earlier
291   <tag>.
292   
293   In each procedure above, Step #3 may occur any time after step 2.
294   Unless you explicitly remove them with "tag -d", a <tag> is permanent.
295   
296   The <branch_tag> is an unusual creature. It labels a branch in a way
297   that allows you to "checkout" the branch, to "commit" files to the end
298   of the branch and to refer to the end of the branch. It does not label
299   the base of the branch (the branch point).
300   
301   There are two obvious ways to choose the <branch_point_tag> and
302   <branch_tag> names. But keep in mind that the <branch_tag> is typed by
303   any developer who wants to work on the branch -- you should make it
304   mean something to them.
305   
306   Style #1 presumes that the simple version string refers to a set of
307   designed, documented or promised features, not to a specific set of
308   files. In this case, you tag the branch with the generic Version
309   string and assume that whenever you refer to "Version", you want the
310   "latest" set of files associated with that Version, including all
311   patches. (You can substitute whatever you like for "bp_", as long as
312   your <branch_point_tag> is some modification of the <branch_tag>.)
313   
314                <branch_point_tag>      Matching <branch_tag>
315
316                bp_V1_3                 V1_3
317                bp_Release2-3-5         Release2-3-5
318                bp_Production4_5        Release4_5
319
320   Style #2 presumes that the simple version string refers to the
321   specific set of files used to construct the first release of
322   "version". In this case, you tag the branch-point revisions with the
323   generic Version string and assume that whenever you refer to this
324   Version, you want the original set of released revisions. To get the
325   latest patched revisions of the release, you refer to the branch tag
326   "latest_<branch_point_tag>". (You can substitute what ever you like
327   for "latest_", as long as your <branch_tag> is some modification of
328   the <branch_point_tag>.)
329   
330                <branch_point_tag>      Matching <branch_tag>
331
332                V1_3                    latest_V1_3
333                Release2-3-5            latest_Release2-3-5
334                Release4_5              latest_Production4_5
335
336   In both styles you can find out what you had to change since the
337   original release of this Version by typing:
338   
339            cvs diff -r <branch_point_tag> -r <branch_tag>
340
341   For Style 1, this is:
342   
343            cvs diff -r bp_<branch_tag> -r <branch_tag>
344
345   For Style 2, this is:
346   
347            cvs diff -r <branch_point_tag> -r latest_<branch_point_tag>
348
349   Notes on "being on a branch":
350   
351   - "update -r <tag>" tells CVS to attach a "sticky tag" to working
352   directory (in ./CVS/Tag) and the checked-out files (on each line of
353   ./CVS/Entries).
354   
355   - A "sticky" <tag> (including a <branch_tag>) causes most CVS commands
356   to act as if "-r <tag>" were on the command line.
357   
358   - A "sticky" <branch_tag> indicates that the working directory (and
359   working files) are "on the branch".
360   
361   Last modified: _6/13/1997_
362   
363    4. Once created, how do I manage a branch? 
364    
365   The most important thing you should know about managing a branch is
366   that the creation of a branch is not a lightweight act. When you
367   create a branch, you must also create a set of procedures to keep
368   track of it.
369   
370   Specifically, you must:
371   
372   - Remember that the branch exists. (This is non-trivial if you create
373   a lot of them.)
374   
375   - Plan when to merge it back into the main line of development.
376   
377   - Schedule the order that multiple branch merges are to be done.
378   
379   - If you ever intend to merge branches into each other, instead of
380   limiting merges of branch work back into the "main line", you must
381   keep careful track of which parts of which branches have merged into
382   which other branches.
383   
384   The simplest way to deal with branches is to limit their number,
385   "collapse" them back into the main line as quickly as is reasonable
386   and forget them. If a group wants to continue working, tell them to
387   create another branch off the fully merged main line.
388   
389   Remember that CVS is just a tool. Over time, it will probably handle
390   branching better, requiring less careful attendance. But no matter how
391   good it becomes, the whole idea of "branching" is a complicated
392   management problem. Don't take it lightly.
393   
394   Last modified: _6/13/1997_
395   
396    5. Are there any extra issues in managing multiple branches? 
397    
398   If you plan to split from the "main line" and merge back after a time,
399   the only problem will be scheduling the order of branch merges. As
400   each branch is merged, the main line must be rebuilt and tested.
401   Merging multiple branches (i.e. "lines of development") before
402   building and testing creates more problems than you are ready for.
403   
404   If you plan to collapse some branches into others, then move the
405   combined branches back into the main line, you have to be careful with
406   the revisions and tags you hand to your "update -j" command, but it
407   shouldn't be much trouble.
408   
409   If you plan to allow every branch to incrementally take the work done
410   on other branches, you are creating an almost insurmountable
411   bookkeeping problem. Every developer will say "Hey, I can handle
412   taking just this little bit," but for the system as a whole it is
413   disaster. Try it once and see. If you are forced into this situation,
414   you will need to keep track of the beginning and end points of every
415   merge ever done. Good Luck.
416   
417   Last modified: _6/13/1997_
418   
419    6. How do I merge a whole branch back into the trunk? 
420    
421   If you don't have a working directory, you can checkout and merge in
422   one command:
423   
424                cvs checkout -j <branch_tag> <module>
425                cd <module>
426
427   If you already have a working directory:
428   
429                cd <working_directory>
430                cvs update      <== Optional, to bring it up to date.
431                cvs update -j <branch_tag>
432
433   CVS will print lines beginning with
434   
435   'U' for files that you hadn't changed, but the branch did.
436   
437   'M' for files that you changed and the branch didn't
438                *and* for files that you both changed that were merged
439                without overlaps.  (This overload is unfortunate.)
440
441   'C' for files that you both changed in a way that conflicts
442                with each other.
443
444   You need to go edit all the 'C' files and clean up the conflicts. Then
445   you must commit them.
446   
447   Last modified: _6/13/1997_
448   
449    7. How do I merge changes from the trunk into my branch or between
450    branches? 
451    
452   The idea is similar to the above, but since CVS doesn't treat the main
453   branch like other branches, you'll have to be more careful. There are
454   5 different ways to look at the problem.
455   
456     The way to merge *all* changes made on the trunk into a working
457   branch is to move to the branch you want via "checkout -r" or "update
458   -r":
459   
460                cvs update -r <branch_tag> {optional files}
461
462   Then merge the changes from the trunk into your working branch using
463   the pseudo-tag named "HEAD":
464   
465                cvs up -j HEAD {optional files}
466
467   You will get everything from the branch point of the branch named
468   <branch_tag> up to the HEAD of the main branch. This is still kind of
469   strange. If the file is on a branch, HEAD should be the latest thing
470   on the branch, not the HEAD of MAIN. But that's not the way CVS
471   (currently) works.
472   
473   If you run "cvs up -j HEAD" again after adding more revisions to the
474   trunk, you may get overlaps for the text you have already merged. It
475   depends on your version of your RCS "merge" command (actually the "co
476   -j" option, which depends on the version of "diff3" you configured RCS
477   to use).
478   
479     You can merge the difference between any two <tags> using two "-j"
480   options on "update" or "checkout".
481   
482   Identify the two tags on the branch you want to merge from.
483   
484                cvs update -j <tag1> -j <tag2> {optional files}
485
486   This step assumes you were careful about tagging milestones. You can
487   use this technique for any two <tags> on the same branch, even the
488   trunk. It is also possible to use tags on different branches, but
489   you'll have to ponder the meaning of the difference between those two
490   tags.
491   
492   In place of one of the <tags>, you can use a <branch_tag> to refer to
493   the latest revision on that branch. See 4C.11 and 4C.3 for info on
494   branch points.
495   
496   Merges can also be performed by handing RCS revisions to the '-j'
497   options, but since revision numbers aren't the same in all files,
498   merging by number is normally limited to one file. Sets of files with
499   the exact same trees of branches and revision numbers would work too,
500   but that's a rare situation.
501   
502     To "take" revisions from other branches instead of merging them, see
503   4C.19 for an idea.
504   
505     A way to gain the effect of merging the main to the branch is to
506   merge the branch into the main using the normal
507   
508                cvs update -A {optional files}
509                cvs update -j <branch_tag> {optional files}
510                cvs commit
511                cvs tag -F  -b <same_branch_tag> {optional files}
512
513   See part B of 4D.5
514   
515     Other oddities.
516   
517   This also works, but is probably not officially supported:
518   
519                   cvs update -j N {optional files}
520
521   where N is a number. This will merge all the changes from the branch
522   point up to the highest revision on the main branch starting with N.
523   For example, if your highest trunk revision is 1.52, you can use this
524   to grab revisions from the trunk:
525   
526                   cvs update -j 1 {optional files}
527
528   Another example: Say you have a branch point at rev 1.2 for a branch
529   named "BR1" and trunk revisions 1.3, 1.4, 2.1, 2.2, 2.3, 3.1, 3.2.
530   Then:
531   
532                   cvs update -j 1 {optional files}
533
534   will merge the changes from 1.2 to 1.4
535   
536                   cvs update -j 2 {optional files}
537
538   will merge the changes from 1.2 to 2.3
539   
540                   cvs update -j 3 {optional files}
541
542   will merge the changes from 1.2 to 3.2, which in this example, is
543   equivalent to the use of "-j HEAD" in part A above.
544   
545   The intuitive (at least to me):
546   
547                   cvs up -j MAIN (or TRUNK) {optional files}
548
549   doesn't work. If the trunk (i.e. "main branch") had an implicit branch
550   named "MAIN", you could use:
551   
552                   cvs up -j MAIN:10/26 -j MAIN:now {optional files}
553
554   and refer to date-stamped revisions on the trunk using the
555   <branch_tag>:<date> support that works on other branches.
556   
557   You might also think you could place an explicit tag on branch 1 (or
558   higher) (e.g. MAINHACK:1) and use it in place of the implicit "MAIN",
559   but I haven't found the right combination.
560   
561   [[If you find working techniques, I'll add them here.]]
562   
563   Last modified: _6/13/1997_
564   
565    8. How do I merge onto the Main Branch a file that exists only on a branch
566    other than the Main Branch? (i.e. it is in the Attic) 
567    
568   For how such a file can exist, see 3A.2 and 3A.3.
569   
570   For how to avoid creating such a file, see 3A.5.
571   
572   Though you might think that the "update -j" command could perform the
573   "merge" of a file from the side branch to the Main Branch, it isn't
574   (yet) smart enough. Unfortunately, there is no single CVS command to
575   do this -- it takes three steps:
576   
577     To move something onto the Main Branch from the Attic, you have to
578   physically move the file from the Attic to the main Repository
579   directory associated with your working directory.
580   
581   It is exactly like resurrecting a removed file. See 3L.4
582   
583   I use something like this: (csh-like syntax)
584   
585   set repos = `cat ./CVS/Repository` mv $repos/Attic/filename,v
586   $repos/filename,v
587   
588   (If you use relative paths in your Repository files, that first line
589   becomes: set repos = $CVSROOT/`cat ./CVS/Repository`)
590   
591     Now that the file is physically in the right place within the
592   Repository, "update -A" will make it appear in your working directory
593   on the Main Branch. Do that now.
594   
595     You now have a choice. The act of physically moving the file has
596   fused together the <branch_tag> branch and the Main Branch for this
597   file. You can continue that way, making changes along the RCS Main
598   Branch which CVS will (for this type of file only) treat as both the
599   Main Branch and the <branch_tag> branch.
600   
601   The other choice, which I would suggest, is to re-tag the file with
602   <branch_tag>, restoring a normal-looking magic branch tag to the file:
603   
604                cvs tag -F -b <branch_tag> <file>
605
606   After you have done the above, you can run "update -A" or "update -r
607   <branch_tag>" to resume whatever you were doing before you started
608   this procedure.
609   
610   Caveat: The final result is a file whose revision tree doesn't look
611   like it was ever on any branch but the Main Branch until the above
612   "tag -F -b" command was executed. CVS and RCS have no way of saving
613   the history of the actions you have just performed.
614   
615   Last modified: _6/13/1997_
616   
617    9. How do I know what branch I'm (working) on? 
618    
619   Type:
620                cvs status
621
622   and look at the "Sticky Tag" field for each file. If:
623   
624     The *same* tag is on *every* file in your working tree, *and*
625   
626     That tag matches the contents of the ./CVS/Tag file, *and*
627   
628     That tag is a branch tag,
629   
630   then you know what branch you are working on. You can get sticky Tag
631   information directly from the ./CVS/Entries file instead of "cvs
632   status".
633   
634   If all the sticky Tags don't agree, then your directory is temporarily
635   inconsistent. This is a feature allowing you to make changes (or
636   perform merges) to individual files on multiple branches without
637   checking out the whole directory.
638   
639   The sticky Tag on each file in the ./CVS/Entries file (as displayed by
640   the "status" command) indicates what branch the working file is on.
641   New files are added to the Tag stored in ./CVS/Tag.
642   
643   To force your entire working directory onto the same branch, type:
644   
645                cvs update -r <branch_tag>
646
647   Last modified: _6/13/1997_
648   
649    10. Do I really have to know the name of the branch I'm working on? 
650    
651   If a developer can't be relied on to know what branch of development
652   to work on, then either the developer's manager isn't planning
653   branches properly or the developer has serious problems.
654   
655   I have found that one of the hardest concepts to get across to
656   developers (and some managers) is that "a branch in development" (as
657   opposed to the use of RCS branches to support some other scheme) is a
658   heavyweight act. Every time you create a real branch in development,
659   you must spawn a set of managerial procedures and a schedule by which
660   you plan to merge each branch into each other branch. Unless you plan
661   to keep it simple and collapse (by merging and forgetting) branches
662   quickly, they are not to be created lightly.
663   
664   In other words, if you don't regularly attend group meetings in which
665   the branch to be worked on is a major topic of discussion, then the
666   group is not managing branches properly.
667   
668   We created a couple major branches a few months ago and even the
669   customer service people refer to the "XYZ branch" as a shorthand for
670   "continuing development on the XYZ project".
671   
672   Last modified: _6/13/1997_
673   
674    11. How do I refer to the revision where I branched so I can see what
675    changed since the Branch Point on another branch? 
676    
677   Given the current <branch_tag> format, there is no direct way to refer
678   to the branch point, which is more useful in many ways than referring
679   to the branch, which always refers to the latest revision on the
680   branch.
681   
682   When CVS adds a branch tag, it attaches an RCS symbol to a
683   non-existent revision number containing the revision number of the
684   branch point as a prefix. (See Section 3O, on the "tag" command.) RCS
685   can't use the CVS magic branch tag and many of the CVS commands can't
686   refer to it.
687   
688   To be certain of your ability to refer to a branch point, you must
689   create a "branch point" tag at the same time as the Branch tag. See
690   4C.3.
691   
692   Last modified: _6/13/1997_
693   
694    12. Why didn't the command "cvs admin -bBRANCH1 *" create a branch? 
695    
696   Because your command creates an RCS branch, not a CVS branch. See the
697   above discussion on branches. RCS branches are used to support CVS
698   branches, but they are not the same. You can't act as if you have
699   direct control over the RCS files.
700   
701   The "admin" command was placed there as a convenience to allow you to
702   execute raw "rcs" commands on the Repository, taking advantage of
703   CVS's ability to find the files in the Repository.
704   
705   But you have to remember that you are using RCS commands on a CVS
706   Repository, which is not generally safe unless you know exactly what
707   CVS depends on.
708   
709   For one thing, CVS insists on control of the default branch. It is set
710   either to the Main branch or the Vendor branch depending on whether
711   you have changed the Vendor's code. If you change the default branch,
712   you are monkeying with the internals and you will get unexpected
713   results.
714   
715   To set your "default CVS branch" to BRANCH1, you must use "checkout"
716   or "update" with the "-r BRANCH1" option. Then you have changed CVS's
717   idea of your "default branch", which has little to do with RCS's
718   default branch.
719   
720   Last modified: _6/13/1997_
721   
722    13. Is it possible to set the "default CVS branch" for everyone? 
723    
724   No. It doesn't work that way.
725   
726   When using CVS, all administrative information (such as what branch
727   you checked out) is stored in CVS sub-directories, local to the user.
728   There is no global state, other than the description and logging files
729   in the $CVSROOT/CVSROOT directory.
730   
731   You tell "checkout" or "update" what branch you want to check out via
732   the "-r <tag>" option. The default is CVS's "Main Branch".
733   
734   I don't see a problem in *designing* a new way to indicate what branch
735   you get by default, instead of the main one, but that's not how it
736   currently works.
737   
738   Last modified: _6/13/1997_
739   
740    14. How do I perform a large merge? 
741    
742   Large merges require a bit more planning to be able to track what has
743   happened in the inevitable cases where something goes wrong. No tool
744   can force a "merge" to make perfect sense.
745   
746   Though you can handle the details in many different ways, the two ends
747   of the spectrum of merge techniques are: gonzo and paranoid.
748   
749     The gonzo method assumes that you know everything about your sources
750   so that recovery from failures is "just a matter of typing." You
751   created the branch this way:
752   
753                cvs checkout <module>
754                cd <module>
755                cvs tag -b <branch_tag>
756                cvs update -r <branch_tag>
757                >>> Edit away.
758                cvs commit              <<== Onto branch
759
760   Now you want to merge your branch back into the Main branch, you are
761   certain you can make it work, or at least detect all the failures, so
762   you dive in and hack away: (For simplicity, we will assume you are
763   collapsing (i.e. merging and forgetting) a side-branch into the Main
764   branch from your single working directory.)
765   
766                cvs update -A
767                cvs update -j <branch_tag>
768                >>> Edit the 'C' files and remove the overlaps.
769                >>> Edit some more to make it all compile and work.
770                cvs commit
771
772   Looks simple. For more details on the output from the "update -j"
773   command, see 3P.2 and 4C.6.
774   
775   Note: You could also checkout a whole new working directory and
776                 perform the merge at the same time by replacing the two
777                 update commands with these two commands:
778
779                        cvs checkout -j <branch_tag> <module>
780                        cd <module>
781
782     The paranoid way is more difficult, but it can catch all sorts of
783   problems. You created the branch this way:
784   
785                cvs checkout <module>
786                cd <module>
787                cvs tag <branch_point_tag>
788                cvs tag -b <branch_tag>
789                cvs update -r <branch_tag>
790                >>> Edit away.
791                cvs commit              <<== Onto branch
792
793   The extra tag command places a non-branch tag on the Branch Point, an
794   act that makes it easier to do "diffs" later. Now we decide to perform
795   the merge:
796   
797                cvs tag <latest_on_branch_tag>
798                cvs update -A
799           *1*  cvs diff -r <branch_point_tag> -r <latest_on_branch_tag>
800                >>> *1* shows all the changes on the branch.
801           *2*  cvs diff -r <branch_point_tag> -r HEAD
802                >>> *2* shows the changes on the trunk since branching.
803                cvs tag <premerge_tag>
804                cvs update -j <branch_tag>
805                >>> Edit the 'C' files and remove the overlaps.
806           *3*  cvs diff
807                >>> Verify that *3* matches *1*, except for line numbers.
808                cvs commit
809                cvs tag <just_merge_changes_tag>
810                >>> Edit some more to make it all compile and work.
811                cvs commit
812                cvs tag <after_merge_cleanup_tag>
813
814   The reason *3* and *1* match so closely is that they are the
815   differences between two pairs of starting points and ending points
816   after the same data was inserted. If they are significantly different,
817   you will want to figure out why.
818   
819   NOTE: You will have to tell everyone to stay the hell out of the
820   Repository while you do this. If they commit something while you are
821   in the middle of a merge, your job will be much more difficult. If
822   they "update" at the wrong time, their work will be randomized until
823   you finish. It's better to call a halt.
824   
825   See 3H.13 for some more information about dealing with merges after
826   import. The last part of the procedure is applicable to any large
827   merge.
828   
829   Last modified: _6/13/1997_
830   
831    15. Is a Vendor merge any different from a branch merge? 
832    
833   No. In most ways, a Vendor branch is exactly the same as any other
834   branch. In a Vendor merge, the data is append to the branch by the
835   "import" command, rather than by hand-editing, but the merge process
836   is the same.
837   
838   See the "import" command in section 3H.
839   
840   Last modified: _6/13/1997_
841   
842    16. How do I go back to a previous version of the code on a branch? 
843    
844
845
846
847        You can avoid digging into RCS revision numbers (executing "update
848        -r (rev)" on each file) by trying one of these:
849
850Use non-branch tags as you normally would.  Non-branch tags
851           attach to specific revisions, so a "tag (tag)" command would
852           mark the revisions you have in your working directory, which
853           are on your branch.  If you need to retrieve them, use "update
854           -r (non-branch-tag)"
855
856           Doing this overrides the sticky (branch-tag) attached to your
857           working directory with a non-branch tag, which means you won't
858           be able to commit until you again move forward to the end of
859           the branch with "update -r (branch-tag)".
860
861Use the "update -r (branch-tag):(date)" trick.
862
863           This is almost like using the '-D' option, but it looks for
864           revisions extant on (date) only along the given branch.
865
866           As in #1, you can't commit to this kind of working area,
867           because it has a sticky date referring to revisions in the
868           middle of a branch.
869
870[comment from the audience:  You are dreaming..
871this does not work.. try it, you get
872No such tag: "MYTAG:May 1"
873or similar. I wish it did because I need it. julian@whistle.com]
874
875
876You can branch a branch.
877
878           If you add a branch tag to file in a working directory that was
879           checked out on a branch, you will branch the branch.  This
880           works just fine, though you'll have to play some games to merge
881           everything back together again.  You'll also create 6-part
882           revision numbers.  (They'll be 8-part revision numbers if you
883           branch a branch that started out with some unmodified files on
884           the Vendor branch.  Think about it.  How does revision
885           1.2.4.2.4.2.2.1 grab you?)
886
887
888(fixed formatting, kingdon@cyclic.com)
889
890   Last modified: _9/8/1997_
891   
892    17. Once I've found the files I want, how do I start changing them? I keep
893    getting warnings about sticky tags. 
894    
895   What you probably did was type "cvs update -r <tag>" where <tag> is a
896   non-branch tag. "update" created a sticky tag for a specific revision,
897   not a branch. To start working right there, you have to create a
898   branch to work on.
899   
900   You have two choices.
901   
902     You can do it in place and keep working:
903   
904           cvs tag -b <branch_tag>      <<== To tag the current files.
905           cvs update -r <branch_tab>   <<== To move onto the branch.
906
907     You can do it "externally" and create a new working directory:
908   
909           cvs rtag -b -r <tag> <branch_tag> <module>
910           cvs checkout -r <branch_tag> <module>
911
912   <module> can be a relative path within the Repository.
913   
914   <tag> in the above is the non-branch tag you placed earlier
915                 that caused the error in your question.  Be warned that
916                 if <tag> is not set on all the files (or all the right
917                 revisions) you won't get exactly what you wanted.
918
919   Last modified: _6/13/1997_
920   
921    18. Why do I get the latest files on the branch when I tried to "update -r
922    <tag>"? 
923    
924   If "update -r <tag>" always retrieves the latest files on a branch,
925   then <tag> is really a <branch_tag>. A branch tag is supposed to be
926   used to grab a branch to work on. Since you can't modify a file in the
927   middle of a branch, checking out a <branch_tag> will give you the
928   latest revision on the branch.
929   
930   If you want to "checkout" a specific collection of revisions, you must
931   use a "non-branch" tag. See the first part of 4C.16.
932   
933   Last modified: _6/13/1997_
934   
935    19. How can I avoid a merge? I just want to move the latest revision on my
936    working branch directly onto the trunk. 
937    
938   There is no direct way to do this using CVS, though the technique is
939   not difficult using shell commands. Here's one way:
940   
941     Move your working directory to the Main Branch.
942   
943                cvs update -A
944
945     Use "update -p" to grab the latest revision on the branch and write
946   it over your working files. Make sure you don't have an modified files
947   -- you will lose them. The following is in "csh" syntax. Change the
948   wildcard to grab the files you want
949   
950   foreach i (Makefile *.cc *.hh)
951                    cvs update -p -r <branch_tag> $i > $i
952                end
953
954     Commit all the working files onto the Main Branch.
955   
956                cvs commit -m 'Moved branch <branch_tag> onto MAIN'
957
958   You should experiment with the above before blasting everything.
959   
960   Last modified: _6/13/1997_
961   
962    20. How to I avoid merge collisions in the RCS $\Log$ data? 
963    
964   In short, you can't. The RCS $\Log$ keyword is handled differently
965   from all other RCS keywords.
966   
967   On the info-cvs mailing list, there is a periodic discussion that goes
968   something like this:
969   
970   Question: How do I deal with $\Log$? Answer1: You can't do much with
971   it. Here's how it works. . . Answer2: I've found a limited way to use
972   it. . . Answer3: Get rid of it. $\Log$ is an abomination.
973   
974   I tend to lean toward answer #3. There are only two sets of people who
975   would ever have access to logs stored within sources files, developers
976   and source customers.
977   
978   For developers:
979   
980     Log entries within sources files are notoriously incomplete, rushed,
981   poorly phrased and in many cases incorrect, making them useless for
982   debugging or file maintenance. I remember a maxim from "Software
983   Tools" (I believe): "Read the code, not the comments." No managerial
984   order or plan for programmer discipline will affect this in the real
985   world.
986   
987     Log entries are usually in an unreadable mixture of styles. Many log
988   entries are just plain meaningless. Some are foolish. Some are even
989   insulting. Examples:
990   
991   "Corrected spelling of misspelling." "Bug fix." "Reversed stupid
992   change in previous revisions." "If Joe could do his job, this would
993   already have worked."
994   
995     Log entries are not managed well by the tools. Any merge can cause
996   conflicts in the $\Log$ data. Branch merges produce incomplete logs.
997   They can be edited into chaos and they are not regenerated. They waste
998   space duplicating information available to the developer with a single
999   command.
1000   
1001     Even if correct when originally entered, as changes are made to the
1002   file, log entries become false over time. Humans are not good at
1003   reading down through a list and remembering only the last change
1004   affecting something. Over time *most* of the log is wrong.
1005   
1006     Even if still correct, the log data is almost useless to developers
1007   without the code diffs. If you can get code diffs, you can display the
1008   log.
1009   
1010   For source customers the problem is even worse. The last thing you
1011   want to show customers is a hodge-podge of tiny comments about large
1012   changes followed by a series of emergency fixes before delivery. If
1013   you distribute sources, then you should provide documentation, or
1014   changelogs reviewed by people who won't let comments like "Fixed for
1015   stupid customer." out the door.
1016   
1017   Conclusion: Though some people would prefer to see in this FAQ
1018   techniques for making the $\Log$ entries the best they can be, I
1019   believe them to be a lost cause. My suggestion is to hunt down, root
1020   out and destroy all occurrences of $\Log$ and the unusable data
1021   attached to it wherever you may find it.
1022   
1023   Last modified: _6/13/1997_
1024   
1025    21. Why should I trust automatic merges? 
1026    
1027   Some developers have the feeling that three-way merging doesn't work.
1028   They fear and distrust the way the "update" command automatically
1029   merges committed changes from the Repository into the working file.
1030   
1031   Experience has shown that most merges are utterly painless and most of
1032   the rest are easily resolved. The few conflicts that cause headaches
1033   are nearly all due to poor communication between developers, a problem
1034   no source control system can obviate.
1035   
1036   Some developers were troubled in the past by flaky Unix software. I
1037   can't say that everything is perfect, but the tools CVS depends on
1038   (RCS and diff, mainly) are fairly solid nowadays. They work.
1039   
1040   Since it does seem to work for most of us, the algorithm is unlikely
1041   to change soon. Why not test it on a couple trouble spots and if it
1042   works for you, use it for a while? Then you can make an informed
1043   decision.
1044   
1045   Last modified: _6/13/1997_
1046   
1047    22. How does CVS decide if it can safely perform a merge? 
1048    
1049   CVS can merge any text file, possibly discovering a conflict and
1050   leaving overlaps for you to edit. Editing the conflict markers out of
1051   the file is a moment's work, but resolving the conflict could take an
1052   arbitrary amount of time. CVS works to determine if it *should* merge,
1053   not if it *can*.
1054   
1055   See 2B.6 for how the merge proceeds.
1056   
1057   Last modified: _6/13/1997_
1058   
1059    23. After resolving merge conflicts in a file, what if I want to keep my
1060    previous version, and not take any of the branch changes? 
1061    
1062   If you want to retain your previous version, a version on the MAIN
1063   branch greater than 1.1 (one you committed there), just throw the
1064   merged file away and "cvs update" the file.
1065   
1066   You don't need to commit something to remember it. The tags you place
1067   before and after the merge should give all the handles you need to
1068   find various versions. You don't have to create a new version of the
1069   file.
1070   
1071   If you want to retain the previous Vendor revision, you can grab a
1072   copy of it using "cvs update -p" and commit it or use the technique
1073   described in 3B.3 to revert back to the Vendor branch.
1074   
1075   Last modified: _6/13/1997_
1076   
1077  Category: /Advanced_Topics_/Engineering/
1078  
1079   " + Engineering"
1080   
1081    1. Where can I find out about Software Engineering? 
1082    
1083   A couple different people suggested this book:
1084   
1085   Software Configuration Management: Coordination for Team Productivity;
1086   Wayne A. Babich; Addison Wesley; 1986; ISBN 0-201-10161-0
1087   
1088   A number of others suggested Appendix B of the book "Decline and Fall
1089   of the American Programmer" by Ed Yourdon, called "The Programmer's
1090   Bookshelf". It list 87 books you are expected to have read. Since they
1091   publish many of the books, Prentice-Hall distributes this list as
1092   "Prentice Hall Professional Technical reference PTR-125-AA3.
1093   
1094   One interesting item from the Yourdon book: The total number of
1095   professional computer books sold is less than the number of
1096   programmers currently in the United States. It wasn't clear from the
1097   book whether this meant "per year" or not, but it is still
1098   frightening.
1099   
1100   Last modified: _6/13/1997_
1101   
1102    2. How do I flexibly arrange the modules file to describe my sources? 
1103    
1104   An equivalent question might be, "How do I structure my sources?" This
1105   can be a difficult question especially in the areas that are more
1106   political than technical.
1107   
1108   Generally you want to think about which pieces of your system need to
1109   be checked out together, built as one system or tagged as a consistent
1110   whole. You should certainly create module names that correspond to
1111   complete, buildable collections that you would tag and release as one
1112   "product". It is also convenient to create module names for small
1113   sections of the Repository containing files that will all be worked on
1114   at the same time by the same person or group.
1115   
1116   Once you have defined the structure of your work, you can usually see
1117   how to lay it out in a Repository. After that the modules file is
1118   easy. You set up module names and aliases to match what you need to
1119   check out by name. If you like relative directories, it is possible,
1120   but not recommended, to work completely without a modules file. See
1121   1D.11 and 2C.7 for some info about the modules file.
1122   
1123   Here are a few types of modules. You should experiment to see what
1124   kind of structure each of these produces. They all have different
1125   uses.
1126   
1127     Connected projects in one group with two separate helper
1128   directories. The helper directories can contain build tools, header
1129   files, libraries, or whatever you like.
1130   
1131   These are all aliases that checkout relative pathnames. The equivalent
1132   results could be produced by placing the selected relative pathnames
1133   on the "cvs checkout" command line.
1134   
1135           pr1  -a P1 HELPERS
1136           pr2  -a P2 HELPERS
1137           pr3  -a P3 HELPERS
1138           pr12 -a P1 P2 HELPERS
1139           pr13 -a P1 P3 HELPERS
1140           pr23 -a P2 P3 HELPERS
1141
1142           P1           -a group1/proj1
1143           P2           -a group1/proj2
1144           P3           -a group1/proj3
1145           HELPERS      -a group1/helper1 group1/helper2 MAKEFILE
1146           MAKEFILE     -a group1/Makefile
1147
1148   Actual Repository directory structure: (from $CVSROOT down)
1149   
1150   group1/ Makefile The top level Makefile. helper1/ helper2/ Helper
1151   files and dirs proj1/ Files and dirs proj2/ Files and dirs proj3/
1152   Files and dirs
1153   
1154   "checkout group1" produces a duplicate of the above. "checkout projX"
1155   produces all but "projY" and "projZ". "checkout projXY" produces all
1156   but "projZ".
1157   
1158     Here is the exact same set of module names describing the same
1159   Repository layout using module names (and aliases containing module
1160   names) instead of merely aliases for relative pathnames.
1161   
1162   There is one difference in the result. The name of the top level
1163   directory in the checked out working tree will match the "module" name
1164   (e.g. pr1) instead of always being "group1" as it was in the first
1165   example above.
1166   
1167           pr1  group1 proj1 &HELPERS
1168           pr2  group1 proj2 &HELPERS
1169           pr3  group1 proj3 &HELPERS
1170           pr12 group1 proj1 proj2 &HELPERS
1171           pr13 group1 proj1 proj3 &HELPERS
1172           pr23 group1 proj2 proj3 &HELPERS
1173
1174           HELPERS      -a helper1 helper2 group1-Makefile
1175           helper1      group1/helper1
1176           helper2      group1/helper2
1177           group1-Makefile -d . group1 Makefile
1178
1179   The above line (with the -d in it) says that when the module named
1180   "group1-Makefile" is checked out, the file named Makefile file will be
1181   found in a directory named $CVSROOT/group1 and will be checked out
1182   into a directory named '.', which obviously already exists.
1183   
1184   The & references say to interpret those pathnames relative to the
1185   directory where the whole module is stored. For the "pr1" module, that
1186   directory is "group1", so the &HELPERS reference winds up placing
1187   Makefile in '.' relative to "group1".
1188   
1189     A short one containing the basic "module" actions:
1190   
1191           m1           head/path file1 dir2 file3 dir4 file5
1192
1193   When checked out, a directory named "m1" appears in your current
1194   directory. Elements named file1, dir2, file3, dir4, and file5 appear
1195   in it. They were originally taken as relative paths from
1196   $CVSROOT/head/path.
1197   
1198     Here's another way to construct a working directory out of pieces of
1199   the Repository:
1200   
1201                projX   projX Makefile &projX_inc &projX_src &projX_doc
1202
1203                # The first line selects a single file within projX, plus
1204                # the contents of three other modules.  Those three other
1205                # modules rename their directories.
1206
1207   projX_inc -d include projX/inc projX_src -d source projX/src projX_doc
1208   -d documentation projX/doc
1209   
1210     A Unix tree. This is similar to what CVS was developed for and the
1211   way I have used it for years.
1212   
1213                # Top level
1214                unix            unix
1215                u_bin           unix/bin
1216                u_etc           unix/etc
1217                u_man           unix/man
1218                usr-bin         unix/usr.bin
1219
1220                # Subdirs of top level dirs.  (tiny subset)
1221                ls              unix/bin/ls
1222                fsck            unix/etc/fsck
1223                man8            unix/man/man8
1224
1225                # Programs without subdirs. (tiny subset)
1226                cat             unix/bin Makefile cat.c
1227                uniq            unix/usr.bin Makefile uniq.c
1228
1229                # /usr/local/src
1230                localsrc        localsrc
1231                gnu             localsrc/gnu
1232                public          localsrc/public
1233                X11             localsrc/X11
1234
1235                # GNU and PD tools
1236                cvs             localsrc/gnu/cvs
1237                emacs           localsrc/gnu/emacs
1238                rcs             localsrc/gnu/rcs
1239                btoa            localsrc/public/btoa
1240                tcsh            localsrc/public/tcsh
1241
1242                # X11 related items.
1243                tvtwm           localsrc/X11/contrib/tvtwm
1244
1245   "unix" was checked out and built from the top down, using a set of
1246   Makefiles that knew about the whole structure. "localsrc" was kept
1247   checked out in /usr/local/src.
1248   
1249   At any time I could run "checkout ls" or "checkout cat" and get a
1250   simple directory with only that tool in it, plus a subset Makefile
1251   that knew how to build that tool against the installed (or alternate,
1252   via environment variables) headers and libraries.
1253   
1254   I found it very handy to be able to run "ls" and see the three tools I
1255   was porting that week.
1256   
1257   Last modified: _6/13/1997_
1258   
1259    3. Can I have multiple source repositories, one for each project? 
1260    
1261   Yes, you can have as many Repositories as you like. But each
1262   Repository must be managed separately, creating additional work.
1263   
1264   Question 4A.1 provides a short description of setting up a single
1265   Repository. A few additional considerations:
1266   
1267     It is a good idea to start by creating a single Repository and split
1268   it up (or create additional Repositories) only if you believe it is
1269   really necessary. I would only create a new Repository if the data is
1270   completely disconnected from the rest of the main Repository.
1271   
1272     If there is a lot of overlap among the developers working on the
1273   collections of files you want to place in different Repositories, or
1274   if there is any connection between those collections, I would go out
1275   of my way to create a single Repository. It is much easier to manage.
1276   
1277     Disk space should not be a factor since you can build up a
1278   Repository using symbolic links and/or remote mounts.
1279   
1280     Each Repository is completely distinct. You can't check out modules
1281   from different Repositories at the same time. A better way of looking
1282   at it is that if you *can* check out two modules or directories with a
1283   single "checkout" command (without contortions or explicit absolute
1284   pathnames), then they are in the same Repository.
1285   
1286     To "checkout" modules from multiple Repositories, you must use the
1287   "cvs -d" option on all CVS commands or alter your $CVSROOT variable
1288   when you change focus to another Repository. If you work with multiple
1289   Repositories, it is a good idea to configure CVS to use absolute
1290   pathnames in the ./CVS/Repository file, since most commands (other
1291   than "checkout") will use that file rather than $CVSROOT.
1292   
1293     If you configure CVS to use relative pathnames in your
1294   ./CVS/Repository files, you must always be careful to set your
1295   $CVSROOT properly or you will get unexpected results.
1296   
1297   If you have two modules or directories by the same name at the same
1298   relative path inside two different Repositories, you are asking for
1299   disaster. You could unexpectedly update a directory with completely
1300   unrelated files. This is not a fanciful example -- a Repository is
1301   occasionally duplicated for release purposes in which case *all* the
1302   paths in the two Repositories are the same.
1303   
1304   Last modified: _6/13/1997_
1305   
1306    4. Who should administer the Repository and manage the modules file? 
1307    
1308   This is a "management style" question. In large or traditional groups,
1309   the CVS procedures are warped to conform to local conventions. In
1310   small groups, in groups with strong personalities or on new projects
1311   the choice of source control procedures can help create some of the
1312   working environment. Here is a taxonomy of environments I have worked
1313   in or helped set up:
1314   
1315   Situation 1.
1316   
1317   A small number of competent developers working on a medium size
1318   project. We all got along and we all respected each other (at least
1319   technically). Anyone edited anything.
1320   
1321   Modules and Repository admin was mostly left to me. I never found a
1322   problem in minor changes made by anyone else.
1323   
1324   Situation 2.
1325   
1326   A large number of experienced developers sprinkled with wackos. Many
1327   of the developers didn't want to deal with any kind of source control.
1328   They wanted a full-service source control system that caused them zero
1329   thought.
1330   
1331   I learned "big stick" diplomacy here. There was a small number of
1332   "designated" (by me) people who were allowed to do *anything* other
1333   than "update" and "commit". Even "checkouts" were controlled. This is
1334   where I found "history" and "release" the most useful.
1335   
1336   Situation 3.
1337   
1338   A small number of developers who wanted me to "help", but who didn't
1339   want to deal with anything other than their favorite algorithms.
1340   
1341   I didn't have the time to baby-sit this group, so I designated one of
1342   them to be my official contact and made him do it all. He felt sullied
1343   by the requirement to pay attention to anything other than his pet
1344   coding projects, but enjoyed the "status" of being the only one who
1345   could touch the control files without my kicking the chair out from
1346   under him.
1347   
1348   Situation 4.
1349   
1350   A huge number of developers of covering the whole spectrum of
1351   competence and experience split into 20 groups, none of which
1352   cooperated with the others, working on 57 different projects, most of
1353   which didn't inter-operate.
1354   
1355   Managing it in any coherent way was not my responsibility (and beyond
1356   my tolerance for chaos). Too many people. So I privately designated a
1357   person in each group to be the contact and kept watch on the
1358   Repository activity. When something went wrong, I notified the contact
1359   for the group and told him what was happening and *he* kept his troops
1360   in line. They were tougher with their own group that I would have
1361   been.
1362   
1363   Eventually only a few people were willing to touch the control files,
1364   since they were flamed from all directions if they screwed up.
1365   
1366   Situation 5.
1367   
1368   In a medium group of really *serious*, and seriously overworked,
1369   people, someone else was designated the "master". I convinced the
1370   master I knew what I was doing and went on my way.
1371   
1372   No one else in the world was allowed to touch anything.
1373   
1374   Situation 6.
1375   
1376   In a large amorphous group of beginners, experts and clowns, over whom
1377   no one had official control, I was forced to employ a group of
1378   relative beginners (who became experts rather quickly) to police the
1379   world. The ultimate in locking the barn after the horse was stolen, we
1380   kept Chaos from destroying us only by use of superior firepower.
1381   
1382   My choice, if allowed, is to let anyone touch anything. I keep backups
1383   of important items and let people know individually whether I want
1384   them to touch things or not. If someone on my "no touch" list touches
1385   and succeeds, they are allowed more slack. If they screw up after
1386   being warned, their screwup becomes public. After a few months, I
1387   usually have no trouble keeping the world running smoothly, at least
1388   from my (and CVS's) perspective.
1389   
1390   Last modified: _6/13/1997_
1391   
1392    5. Isn't disk space a big factor? CVS copies files out of the Repository,
1393    duplicating everything. 
1394    
1395   Everyone knows that disk space is getting cheaper. How do we reconcile
1396   this with the equally well-known problem that *all* disk is *always*
1397   filled up?
1398   
1399   In my opinion, the main reason disk space will never be an unlimited
1400   resource is that it is the major variable in organizational time/space
1401   tradeoffs. It isn't a problem of waste or an aspect of Murphy's law,
1402   as some claim it is, but rather a direct consequence of good
1403   management. Disk space is, and will always be, a limited resource.
1404   
1405   First, the cost of *deploying* that disk is not dropping as fast as
1406   the cost of the storage medium. The cost of machines to hold the disks
1407   and the networks to connect them are dropping more slowly than disk
1408   media. And the cost of the human time necessary to manage the
1409   machines, networks, disks, and the developers using them, is not
1410   dropping at all. The cost of human time continues to rise.
1411   
1412   If management decides that expensive human time can be saved by using
1413   all that new disk space to keep the last three releases online, then
1414   that's what it will be used for. If each release takes up a Gigabyte
1415   and you support 30 platforms, a simple time-saving suggestion has just
1416   grabbed 100 Gigabytes of disk space. And we've ignored the potential
1417   disk storage needed to support "better Customer Service", another
1418   management refrain.
1419   
1420   Even at 30 cents per Megabyte (next year's price), you've just used up
1421   $30,000 of disk space. And that doesn't count the computers, tape
1422   drives and humans necessary to maintain and deploy all of it. Spending
1423   money to save time has its own overhead, too.
1424   
1425   Binaries are getting bigger. Graphics and data collection devices can
1426   eat up any amount of disk. There are more tools available, more
1427   libraries, more raw data than you can ever store. My home computer has
1428   a Gigabyte of disk on it. It could easily handle 30.
1429   
1430   The "economy" of disk storage media will never remove the need to
1431   manage disk space.
1432   
1433   So, here's an un-reviewed suggestion originally from Graydon Dodson
1434   <grdodson@lexmark.com>, which I've altered and edited heavily.
1435   
1436   - Keep a directory where the whole tree is checked out. (It might be
1437   built and tested once in a while to make sure it is worth linking to,
1438   but that doesn't affect the source control aspect of this procedure).
1439   Let's call it /master/build.
1440   
1441   - Write a tool that creates a tree of directories (like the X11
1442   "lndir" command) filled with links to the checked out files in the
1443   /master/build tree.
1444   
1445   This tool should also provide real copies of, not symlinks to, all the
1446   files within the CVS administrative directories.
1447   
1448   - You could also provide a way for the tool to take a list of whole
1449   directories that you will never change, for which it would create a
1450   single symlink to the directory and not a subtree of symlinks to
1451   files. Or you could rm -r pieces of the resulting working directory
1452   yourself and replace it with links.
1453   
1454   - If you want to edit a file, you have to grab a real copy and keep it
1455   until your revision shows up in the /master/build tree. I'd create a
1456   script to do this: cvsgrab <file>
1457   
1458                #!/bin/csh -f
1459                set f = $1
1460                if (! -l $f) then
1461                   echo "file $f is not a symlink"
1462                   exit 1
1463                endif
1464                rm $f
1465                set rev = `grep "^/$f/" CVS/Entries | awk -F/ '{print $3}'`
1466                cvs update -p -r $rev $f > $f
1467
1468   You can't do a plain "cvs update" since that would grab newer
1469   revisions from the Repository, not the revision you wanted to start
1470   with. After the file is no longer a symlink, you can work normally.
1471   You'll have to run "update" before "commit" anyway if there are newer
1472   revisions.
1473   
1474   - Presumably there would also be a tool to traverse the link tree and
1475   revert it to links if there are no modified files and/or if all the
1476   real files match the revision of the /master/build tree.
1477   
1478   - To avoid confusing CVS when the /master/build revisions are updated
1479   but your CVS/Entries files is not, CVS would have to change to handle
1480   symlinks. It currently causes problems with this scenario:
1481   
1482     ./<file> is a symlink.
1483   
1484     ./CVS/Entries says you are revision 1.2.
1485   
1486     The corresponding CVS/Entries file in /master/build says the latest
1487   revision is 1.3.
1488   
1489     cvs update <file> shows a 'C' conflict flag.
1490   
1491   Last modified: _6/13/1997_
1492   
1493  Category: /Advanced_Topics_/Installing_CVS/
1494  
1495   " + Installing CVS"
1496   
1497    1. What do I have to do before I install CVS? 
1498    
1499     You must decide where to set up a Repository.
1500   
1501   Though you can construct a Repository tree structure using links and
1502   mount points, there must be a single copy of each real file across
1503   your entire organization. You may not "rdist" files and expect to edit
1504   both copies.
1505   
1506   CVS does not support a truly distributed Repository. You can have
1507   multiple Repositories, but each one must be mounted (not copied or
1508   "rdist"ed) from a single place onto all machines where it will be
1509   used.
1510   
1511   Initially, a Repository takes about same amount of disk space as the
1512   sources you want to put into it, plus a bit of overhead for the RCS
1513   files.
1514   
1515   See Section 4B. For multiple Repositories, see 4G.3
1516   
1517     You need a directory in everyone's $PATH variable where you can
1518   install all the executables. /usr/local/bin is a common place.
1519   
1520     You need some helper tools besides CVS such as "RCS" and a good set
1521   of "diff" and "diff3" programs. See 1B.4 for suggestions.
1522   
1523     Read the README, INSTALL and ChangeLog files to see what you are
1524   getting into.
1525   
1526     Make sure you have versions of all the programs mentioned in the
1527   "cvs/src/options.h" and "cvs/src/rcs.h" files.
1528   
1529     Though you can probably muddle along without it, you should appoint
1530   one or more "Repository Administrators" who will be responsible for
1531   maintaining the Repository structure, administrative files and the
1532   "modules" interface.
1533   
1534   Someone at your site should probably be on the info-cvs mailing list.
1535   See 1B.5.
1536   
1537   Last modified: _6/13/1997_
1538   
1539    2. How do I configure the CVS programs? 
1540    
1541     You should certainly start by reading the README file, the INSTALL
1542   files and possibly the ChangeLogs in each directory, the Makefile.in
1543   files and the "cvsinit.sh" program.
1544   
1545     Edit the "options.h" file in the "src" directory.
1546   
1547   You might need to specify a few site-specific pieces of information
1548   including the names of a number of functions.
1549   
1550   Hint1: You probably want to set the DIFF macro to use your version of
1551   the GNU diff program with the '-a' option. Ours is set to "gdiff -a".
1552   
1553   Hint2: You want to use RCS 5.6.0.1 or greater and set the "HAVE_RCS5"
1554   macro.
1555   
1556     Execute the ./configure command.
1557   
1558     Type "make".
1559   
1560     After running "make" you might try running the "sanity.sh" script:
1561   ./src/sanity.sh `pwd`/src/cvs
1562   
1563   It writes into /tmp/cvs-sanity by default.
1564   
1565     Finish reading the INSTALL file and test out the system.
1566   
1567   Last modified: _6/13/1997_
1568   
1569    3. What do I have to install? 
1570    
1571     Install the "cvs" executable and "mkmodules" from the CVS sources.
1572   The man page is useful too. If you plan to report bugs, you should
1573   also install "cvsbug".
1574   
1575     Make sure you have versions of all the programs mentioned in the
1576   options.h file, most of which are included in a standard Unix system.
1577   
1578     Unless you plan to reimplement RCS [:-)], you must install RCS.
1579   
1580   It is a very good idea to examine the RCS installation instructions
1581   and make sure you are using the GNU versions of "diff" and "diff3" or
1582   merges (an important part of CVS) will not work as well as you'd like.
1583   
1584     Set your $CVSROOT environment variable and create the Repository
1585   (which you planned out in 4A.1) with the "cvsinit" command at the top
1586   of the CVS sources.
1587   
1588     You'll need to edit the Repository control files created by
1589   "cvsinit".
1590   
1591     Install any helper programs mentioned in the modules file.
1592   
1593   Last modified: _6/13/1997_
1594   
1595    4. How do I work around the merge problems in GNU diff version 2.1 or
1596    later? 
1597    
1598   See 1B.4 If you use recent versions of RCS and "diff", you won't run
1599   into the above. If you do, see 5B.8
1600   
1601   Last modified: _6/13/1997_
1602   
1603  Category: /Advanced_Topics_/Internal_errors/
1604  
1605   " + Internal errors"
1606   
1607    1. Explain: "ci error: unexpected EOF in diff output" 
1608    
1609   RCS versions earlier than 5.5 print the above error when a file does
1610   not end in a newline character. It can be caused by:
1611   
1612   - Editing with Emacs and not using "require-final-newline".
1613   - Committing a binary file.
1614   - Filesystem failures (NFS!) that put nulls in your file.
1615   
1616   The solution is to upgrade to RCS 5.5 or later. (Of course, this won't
1617   fix filesystem failures. It will merely allow RCS (and therefore CVS)
1618   to handle the file without error.)
1619   
1620   Last modified: _6/13/1997_
1621   
1622    2. Explain: "RCS file /Repository/module/file.c,v is in use" 
1623    
1624   This is an RCS error that occurs when its internal lock file has been
1625   left around by an RCS command interrupted by some sort of system
1626   crash, disk failure or SIGKILL signal.
1627   
1628   Go into the Repository and look for files with names similar to
1629   "file.c,v", usually starting with ',', '_' or '#'. Make sure they are
1630   really crash remnants and do not belong to transactions in progress --
1631   a recent last-modified timestamp is a good indicator of a live
1632   transaction. Delete them if they are old.
1633   
1634   Last modified: _6/13/1997_
1635   
1636    3. Explain: "co error, line 2: Missing access list" 
1637    
1638   This is an error message from RCS Version 3 when it tries to read a
1639   file created by a later version of RCS.
1640   
1641   HP decided to "standardize" on an ancient version of RCS some time
1642   ago. You can't use it for CVS. See 4H.6.
1643   
1644   Since the error comes from having a later version of RCS than HP
1645   supports, you probably did install the later version but must have
1646   recently changed your $PATH or installed the HP package that has RCS
1647   in it.
1648   
1649   You should either reconfigure CVS to use absolute pathnames to the
1650   proper versions of the RCS programs that CVS uses, or change your PATH
1651   to look there first. If you haven't installed the latest version of
1652   RCS, you should upgrade. See 1B.4
1653   
1654   Last modified: _6/13/1997_
1655   
1656    4. Explain: "error: RCS file name `xyz .c' contains white space" 
1657    
1658   RCS 5.6 doesn't allow white space in filenames. Apparently this
1659   restriction will be removed in RCS 5.7, but CVS may still require that
1660   filenames have no white space in them.
1661   
1662   Last modified: _6/13/1997_
1663   
1664    5. Explain: cvs checkout: warning: <X> is not (any longer) pertinent 
1665    
1666   This message occurs in three instances:
1667   
1668     When there is an entry in the ./CVS/Entries for file <X> and there
1669   is no RCS file in the Repository to back it up.
1670   
1671   If the working file exists, and hasn't changed (determined from the
1672   timestamp) it is removed.
1673   
1674     When you try to check out a piece of the Repository with:
1675   
1676   cvs checkout some/place/in/repository/tree
1677   
1678   and at least the first element of the path (i.e. "some" in the above)
1679   exists, but some part of the rest of it does not.
1680   
1681   The checkout command checks the modules file first for the whole path,
1682   then for a prefix of the path as a module name. If it doesn't find
1683   *any* portion of your path in the modules file, it says:
1684   
1685                cvs checkout: cannot find module `<module/path>' - ignored
1686
1687   If it finds some set of prefix directories, it prints the message you
1688   see.
1689   
1690   In practice this is usually a spelling error.
1691   
1692     If the Repository files you are trying to check out or update are
1693   not readable by you, the same problems can occur. Check the
1694   permissions on the files involved.
1695   
1696   Last modified: _6/13/1997_
1697   
1698    6. Why did a Repository file change from <file>,v to ,<file>,? 
1699    
1700   This is an RCS problem, since the ,<file>, syntax for file names is
1701   used by RCS and not CVS.
1702   
1703   RCS constructs a new <file>,v in a temporary file named ,<file>,
1704   (which doubles as a lock file) then renames it to <file>,v when it is
1705   done. The only way this is reliable is if your system's version of
1706   rename(2) is an atomic, as required by POSIX.
1707   
1708   If your system has a non-atomic (and therefore non-POSIX) rename(2)
1709   system call, RCS runs uses an internal version of this algorithm to
1710   approximate the atomic rename:
1711   
1712   rm <file>,v; ln ,<file>, <file>,v; rm ,<file>,
1713   
1714   If the system crashes, or you lose your NFS connection between the
1715   first "rm", but before the "ln", you can be left only with the
1716   ,<file>, file. If the crash or network failure occurs between the "ln"
1717   and the final "rm", you could be left with a pair of linked names.
1718   
1719   Recovery:
1720   - If only the ,<file>, exists, rename it to <file>,v.
1721   
1722   - If both ,<file>, and <file>,v exist and are linked, remove the
1723   ,<file>, file.
1724   
1725   - If both ,<file>, and <file>,v exist and are separate files, look at
1726   the dates, "diff" them and make your best guess. This sounds like the
1727   remnants of two separate events.
1728   
1729   Last modified: _6/13/1997_
1730   
1731  Category: /Advanced_Topics_/Other_Systems/
1732  
1733   " + Other Systems"
1734   
1735    1. I use a NeXT. Is there anything I need to know? 
1736    
1737   NeXTSTEP 3.0's Interface Builder uses "nib" directories, rather than
1738   the files used in previous revisions. It removes files it doesn't
1739   recognize, making it impossible to place such a directory under CVS --
1740   the CVS admin directory will be removed.
1741   
1742   Some time ago, <Bob_Vadnais@pdh.com> posted a palette named CVSPalette
1743   that claimed to resolve this problem. It was intended to preserve the
1744   CVS administrative directories within nib documents (directories) that
1745   Interface Builder usually removes.
1746   
1747   CVSPalette is no longer in its announced place:
1748   
1749                ftp.cs.orst.edu:/pub/next/submissions
1750
1751   though I did find two other interesting files on ftp.cs.orst.edu:
1752   
1753                /software/NeXT/sources/tools/cvs-next-2_1_1.tar.Z
1754
1755   which is a port of CVS 1.3 (along with RCS and diff) and:
1756   
1757                /software/NeXT/sources/programming/cvs.postamble-2.4.gz
1758
1759   which appears to be a set of wrappers for CVS commands that claim to
1760   allow you to use CVS effectively (and without need for the "command
1761   line") on a NeXT machine.
1762   
1763   [[Anyone know the truth about CVS and NeXT?]]
1764   
1765   Last modified: _6/13/1997_
1766   
1767    2. I use OS/2 and/or DOS and/or Windows. Is there anything I need to know? 
1768    
1769   When using a local repository, be sure to specify the local access
1770   method or CVS will interpret the drive letter as a remote host name
1771   due to the : following it:
1772   
1773        WRONG:  CVSROOT=C:\SRC\CVSROOT
1774
1775        RIGHT:  CVSROOT=:local:C:\SRC\CVSROOT
1776
1777   (larry.jones@sdrc.com)
1778   
1779   You can share RCS files between Unix and DOS while avoiding the MS-DOS
1780   file name limits by setting your RCSINIT environment variable to
1781   '-x/,v'. New RCS files will be created without the standard ",v"
1782   suffix, though files ending in ",v" will still be found if there is no
1783   matching file in the same directory without the ",v".
1784   
1785   Erik van Linstee offers an OS/2 and a DOS port of CVS 1.3 in:
1786   
1787   ftp.informatik.tu-muenchen.de:/pub/comp/os/os2/gnu/devtools or
1788   ftp.rrzn.uni-hannover.de:/pub/os2-local
1789   
1790   The files are named:
1791   
1792                cvs13p?[bs].zip
1793
1794   Where the ? stands for the patch level (currently 8) and the b is for
1795   the binaries, the s for the sources.
1796   
1797   There are three binaries. An OS/2 only one (32-bit), a DOS only one
1798   (16-bit) and an EMX one that runs on both (32-bit).
1799   
1800   There are many differences between the Unix and the DOS versions of
1801   CVS. Read the material that comes with the DOS version before using
1802   it.
1803   
1804   [[Updates?]].
1805
1806   Last modified: _9/22/1997_
1807   
1808    3. I use SCO Unix. Is there anything I need to know? 
1809    
1810   On SCO/UNIX 3.2 V2.0 POSIX signals don't work. Unfortunately the
1811   configure program detects POSIXness and configures in the use of POSIX
1812   signals. Workaround : Edit out the check for POSIXness in the
1813   configure script. [[You could also remove all occurrences of
1814   "-DPOSIX=1" from the Makefiles after configure is run. -dgg-]]
1815   
1816   SCO/UNIX doesn't understand #!/<some shell> syntax. This breaks the
1817   use of log.pl as it gets invoked by /bin/sh instead of
1818   !#/usr/local/bin/perl. WorkAround : edit log.pl and change it into a
1819   shell script which invokes perl with log.perl (renamed from log.pl) as
1820   input.
1821                                Contributed by Joe Drumgoole
1822
1823   Last modified: _6/13/1997_
1824   
1825    4. I use AIX. Is there anything I need to know? 
1826    
1827   The only report on AIX claims to have no trouble using it in concert
1828   with SunOS and IRIX platforms.
1829   
1830   Last modified: _6/13/1997_
1831   
1832    5. I use IRIX. Is there anything I need to know? 
1833    
1834   If you see "uid" numbers where you would expect user names, try adding
1835   -lsun to the link line. Without it CVS is unable to retrieve "passwd"
1836   data through NIS.
1837   
1838   Last modified: _6/13/1997_
1839   
1840    6. I use an HP system. Is there anything I need to know? 
1841    
1842   HP distributes RCS version 3 (a circa 1983 release!) with HP-UX. CVS
1843   does not work with RCS version 3; it requires RCS version 4 or later.
1844   Your best bet is to find the latest version of RCS and install it
1845   somewhere.
1846   
1847   HP-UX 8.07 has a serious bug with the mmap system call and NFS files;
1848   the bug can crash the operating system. Make sure that you configure
1849   RCS to avoid mmap by setting has_mmap to 0 in RCS's conf.h. This bug
1850   is fixed in HP-UX 9.
1851   
1852                                Contributed by Paul Eggert
1853
1854   If using the setgid() trick described in 4D.13, you will have to
1855   create an entry in the /etc/privgroup file to give the group assigned
1856   to the cvs executable setgid permission (see setprivgrp(1m)).
1857   Additionally, if you are restricting "read" access to the Repository
1858   by limiting access to the executable (this requires yet another
1859   group), then you will require that /etc/logingroup exists and is
1860   configured correctly (usually it's just alink to /etc/group).
1861   
1862                                Contributed by Dale Woolridge
1863
1864   Last modified: _6/13/1997_
1865   
1866    7. I use AFS. Is there anything I need to know? 
1867    
1868   There is a problem with the way CVS performs its locking when the
1869   files are within AFS. When your current PTS id != your uid, the locks
1870   are not deleted. The stat() system call returns the PTS id of the
1871   owner. If that id != your uid, CVS assumes you did not lock it, and
1872   leaves the lock files alone. The next time you try to use it, it
1873   complains that someone has the repository locked.
1874   
1875                                Contributed by Michael Ganzberger
1876
1877   [[This was against CVS 1.3. Is it still in CVS 1.4?]]
1878   
1879   Last modified: _6/13/1997_
1880   
1881    8. I use A/UX. Is there anything I need to know? 
1882    
1883   [[??]]
1884   
1885   Last modified: _6/13/1997_
1886   
1887  Category: /Advanced_Topics_/Related_Software/
1888  
1889   " + Related Software"
1890   
1891    1. How do I use CVS under Emacs? Is there an Emacs cvs-mode? 
1892    
1893   The pcl-cvs package distributed with CVS is an emacs package that
1894   helps with the update/commit process. When you are ready to update,
1895   you use the 'cvs-update' command within emacs. This executes "update"
1896   and fills a cvs-mode buffer with a line for each file that changed.
1897   The most helpful features are: descriptive words for what happened
1898   (i.e. Merged or Conflict rather than 'U' or 'C'), single keys bound to
1899   diffs and commits, and the ability to mark arbitrary groups of files,
1900   possibly from different directories, for commit as a whole.
1901   
1902   All the developers in my group that use emacs find pcl-cvs a much
1903   friendlier and more helpful way to update/commit than raw cvs. One vi
1904   user even converted to emacs just to use pcl-cvs.
1905   
1906                                Contributed by Jeffrey M Loomis
1907
1908   Last modified: _6/13/1997_
1909   
1910    2. What is GIC (Graphical Interface to CVS)? 
1911    
1912
1913
1914
1915        GIC provides a graphical user interface to the Concurrent Version
1916        System (CVS), a powerful revision control system.  GIC is
1917        implemented in the Tcl/Tk programming language and is intended to
1918        augment the sometimes cumbersome CVS command line interface.
1919        
1920        Note that according to the official GIC page at
1921        http://www.cpsc.ucalgary.ca/redirect/grouplab/projects/gic/
1922        GIC is no longer being maintained and tkCVS is recommended
1923        instead.  For more on tkCVS, see http://www.cyclic.com/tkcvs/
1924
1925        kingdon@cyclic.com
1926
1927   Last modified: _9/6/1997_
1928   
1929    3. What is CAVEMAN? 
1930    
1931   CAVEMAN is a front end to CVS written in PERL providing a collection
1932   of features desired by the site where it was developed.
1933   
1934   - The ability to spread a "project" over multiple Repositories.
1935   - Optional automatic tagging after each commit.
1936   - Additional locking of files.
1937   - Extra before and after program hooks.
1938   - A layer of event logging.
1939   - All sorts of error messages.
1940   - Many changes to the semantics of commands.
1941   
1942   It is available via anonymous ftp on ftp.llnl.gov [128.115.54.18] in
1943   gnu/caveman_vX.Y.Z.tar.gz (The numbers X, Y, & Z vary.)
1944   
1945   contact Kathleen Dyer kdyer@llnl.gov
1946                                (510)423-6803
1947                                (510)423-5112 FAX
1948
1949   [[Does someone want to elaborate?]]
1950   
1951   Last modified: _6/13/1997_
1952   
1953  Category: /Advanced_Topics_/Setting_up_and_Manag/
1954  
1955   " + Setting up and Managing the Repository"
1956   
1957    1. What do I do first? How do I create a Repository? 
1958    
1959   First, install all the programs. (See Section 4A.)
1960   
1961   Then create a Repository by executing "cvs -d init". (This works with
1962   CVS 1.9.)
1963   
1964   Now you can configure your repository by checking out CVSROOT: "cvs -d
1965   checkout CVSROOT". Change into the created directory CVSROOT. Edit the
1966   files you want to edit, and afterwards, commit the changes by typing
1967   "cvs commit".
1968   
1969   You will certainly want to add modules of your own. Edit the "modules"
1970   file and add lines to describe the items you want to "checkout" by
1971   module name. Here's a short list that could be used for storing a
1972   small number of GNU and PD sources:
1973   
1974                local   local
1975
1976                gnu     local/gnu
1977                emacs   local/gnu/emacs
1978                cvs     local/gnu/cvs
1979
1980                public  local/public
1981                pdprog1 local/public/pdprog1
1982                pdprog2 local/public/pdprog2
1983
1984                test    test
1985                junk    test/junk
1986
1987   Andreas Kostyrka
1988   
1989   Last modified: _4/21/1998_
1990   
1991    2. What are those files in $CVSROOT/CVSROOT? 
1992    
1993   There are eight Repository control (or "database") files of interest
1994   in the CVSROOT directory:
1995   
1996     modules contains the "modules" database. See 1D.11, 2C.7, 4B.6 and
1997   4B.7 for more details.
1998   
1999     commitinfo contains two columns: 1. a regular expression to match
2000   against pathnames within the Repository and
2001   
2002     a <command> to execute for matching pathnames.
2003   
2004   When you execute "commit", CVS passes the Repository pathname for each
2005   directory (and the files to commit within that directory) to
2006   <command>. If <command> exits with a non-zero status, the commit is
2007   blocked.
2008   
2009   A <command> associated with a pathname of "DEFAULT" is executed if
2010   nothing else matches. Every <command> associated with a pathname of
2011   "ALL" is executed separately.
2012   
2013     rcsinfo contains the same first column as commitinfo, but the second
2014   column is a template file for specifying the log entry you are
2015   required to enter for each commit.
2016   
2017   "DEFAULT" and "ALL" work the same as in the commitinfo file.
2018   
2019     editinfo contains the same two columns as commitinfo, but the
2020   <command> in the second column is intended to do some consistency
2021   checking on the commit log.
2022   
2023   "DEFAULT" works as in commitinfo.
2024   
2025     loginfo contains the same two columns as commitinfo, but the
2026   <command> is expected to read a log message from its standard input.
2027   The <command> can do anything it wants with the log information, but
2028   normally it is appended to a log file or sent to mailing lists.
2029   
2030   "DEFAULT" & "ALL" work the same as in commitinfo.
2031   
2032     cvsignore contains "ignore" patterns that are added to the built-in
2033   ignore list. See 2D.10.
2034   
2035     checkoutlist contains a list of other files kept under RCS in
2036   $CVSROOT/CVSROOT that should be checked out by mkmodules to provide a
2037   readable copy.
2038   
2039     history contains a stream of text records, one for each event that
2040   the "history" command is interested in. Though the contents of the
2041   history file can be read, it is intended to be read and displayed by
2042   the "history" command. This file is the only one in the above list
2043   that is not under RCS.
2044   
2045   Last modified: _6/13/1997_
2046   
2047    3. Is there any other state stored in the Repository besides in the
2048    $CVSROOT/CVSROOT directory? 
2049    
2050   Only in the RCS files. The Repository holds exactly two things: the
2051   tree of RCS files (each usually ending in ",v") and the CVSROOT
2052   directory described above.
2053   
2054   Last modified: _6/13/1997_
2055   
2056    4. How do I put sources into the Repository? 
2057    
2058   There are three main ways to put files in the Repository:
2059   
2060     Use the "import" command described in Section 3H.
2061   
2062   This method is the fastest way to put trees of new code into the
2063   Repository and the *only* way to handle source releases from a 3rd
2064   party software vendor.
2065   
2066     Use "add" followed by "commit".
2067   
2068   This is how to add new files and directories to the Repository, a few
2069   at a time. Directories don't need to be committed.
2070   
2071     You can move RCS files directly into the Repository.
2072   
2073   You should create a directory hierarchy to hold them, but you can just
2074   move arbitrary ",v" files into the Repository. The only "state" in the
2075   Repository other than within ",v" files is in the required CVSROOT
2076   directory at the top of the Repository.
2077   
2078   Last modified: _6/13/1997_
2079   
2080    5. What file permissions should I use on (and in) the Repository? 
2081    
2082   If you are using pserver (password-authenticated access), see below.
2083   
2084   If you run a completely open environment (which usually means that you
2085   don't have, or don't want to waste, the time to deal with it):
2086   
2087   - Set all directory permissions to 777.
2088   
2089   - Have everyone set their umasks to 0.
2090   
2091   (BTW, I don't suggest this. I am merely reporting it.)
2092   
2093   If you are a normal Unix shop and want to use groups effectively:
2094   
2095   - Set all the directory permissions in the Repository to 775.
2096   
2097   If you are using a system that handles both System V and BSD
2098   filesystems, you might have to set the permissions to 2775.)
2099   
2100   If you are using one of the many recent versions of Unix that don't
2101   allow you to use the full octal mode, then you'll have to type: chmod
2102   u=rwx,g=rwx,o=rx,g+s dir&gt;
2103   
2104   - Change all the groups on the directories to match the groups you
2105   want to write to various directories.
2106   
2107   - Make sure every user is in the appropriate groups.
2108   
2109   - Have everyone set their umask to 002, including root.
2110   
2111   If you don't want non-group members to even read the files, do the
2112   above, but change:
2113   
2114   - Repository directory permissions to 770. (or 2770)
2115   
2116   - umasks to 007.
2117   
2118   If you work in an environment where people can't be trusted to set
2119   their "umask" to something reasonable, you might want to set the umask
2120   for them:
2121   
2122                mv /usr/local/bin/cvs /usr/local/bin/cvs.real
2123                cat > /usr/local/bin/cvs
2124                #!/bin/sh
2125                umask 2         # Or whatever your site standard is.
2126                exec /usr/local/bin/cvs.real ${1+"$@"}
2127                ^D
2128
2129   Pserver (Password-Authenticated Access) &lt;blome@de.ibm.com&gt;
2130   
2131   The above suggestions are not valid when you use the pserver facility.
2132   Be sure to read and understand the manual section about this (should
2133   be 4.6.something). Above all: do /not/ make the repository and CVSROOT
2134   group writeable. In CVSROOT, make `history� group or world writeable
2135   instead.
2136   
2137   I suggest creating one unix group per project group. In the
2138   repository, you would then create one directory for each group, group
2139   writeable. New projects must then be created in these group
2140   directories. If you don't want to say &lt;group&gt;/&lt;project&gt; on
2141   checkout, create a &lt;project&gt; module and point it there.
2142   
2143   Last modified: _9/24/1998_
2144   
2145    6. How do I structure my Repository? 
2146    
2147   The Repository holds your software. It can be all interrelated or it
2148   can be a bunch of separately managed directories.
2149   
2150   How you break a whole system down into its component parts, while
2151   defining interfaces between them, is one aspect of "Software
2152   Engineering", a discipline that requires the study of dozens of
2153   strange and wonderful areas of the computer and management worlds.
2154   
2155   CVS provides a way to keep track of changes to individual files, a way
2156   to "tag" collections of files, and a way to "name" collections of
2157   files and directories. That's all. Everything else is in the way you
2158   apply it.
2159   
2160   In other words, you should structure your Repository to match your
2161   needs, usually tied in with the other tools you use to build, install
2162   and distribute your work. Common needs include the ability to:
2163   
2164   - mount (or automount) directories from many places in your
2165   organization.
2166   - check out just what you need and no more.
2167   - check out multiple sections in a fixed relation to each other.
2168   - check out large sections to match the assumptions built into your
2169   build system. (Makefiles?)
2170   
2171   In my opinion, you should start small and keep everything in one tree,
2172   placing each major sub-system into a separate directory. Later, when
2173   you know what you are doing, you can make it more sophisticated.
2174   
2175   Last modified: _6/13/1997_
2176   
2177    7. Why would anyone use "modules"? They are too restrictive. I want to be
2178    able to select just the files I want to edit. 
2179    
2180   Any form of structure is restrictive. If you believe that total chaos
2181   is a viable working paradigm, or if you believe you can keep track of
2182   the interrelations between all portions of your Repository in your
2183   head, then you can do what you please.
2184   
2185   If you believe that systems of files require management and structure,
2186   then the "modules" idea is very useful. It is a way to impose a naming
2187   scheme on a tree of files, a naming scheme that can be simpler than a
2188   large list of relative pathnames.
2189   
2190   The "modules" file represents a published interface to the Repository
2191   set up by your Repository Administrator. If s/he did a creditable job,
2192   the modules offered will be internally consistent and will smoothly
2193   interact with the rest of your environment.
2194   
2195   Last modified: _6/13/1997_
2196   
2197    8. How do I rename a file or directory? What are the consequences? 
2198    
2199   In CVS there is no single "rename" command.
2200   
2201   See 2C.4 for the suggested way to rename a file or directory.
2202   
2203   The rest of this section covers some of the consequences of renaming.
2204   
2205   A "renaming database" has been proposed that would keep track of name
2206   changes so that "update -r <tag>" would continue to work across the
2207   renaming. But as it stands, you have to pick one of the following
2208   options:
2209   
2210     Use the technique described in 2C.4. (For each file, duplicate the
2211   file in the Repository, "remove" the old version so it winds up in the
2212   Attic and strip all Tags off the new version.)
2213   
2214   - "update -r <tag>" produces the correct files.
2215   
2216   - The duplicated revision history can be slightly misleading.
2217   
2218   - A plain (i.e. without the "-r <tag>") "checkout" or "update -d" will
2219   create directories "renamed" this way, but you can delete it and a
2220   plain "update" won't bring it back.
2221   
2222     Move the files and directories in the Repository to the new names.
2223   
2224   - You save the revision history under a different file name.
2225   
2226   - You save a little space.
2227   
2228   - "update -r <tag>" produces the wrong files or directories.
2229   
2230   This is not a good general solution, but if you plan never to look
2231   back (someone may be gaining on you!), it is sometimes a useful
2232   notion.
2233   
2234   If you are clever with Makefiles, you might be able to rework them to
2235   handle either the new or old names, depending on which ones exist at
2236   the time. Then you can move an old <tag> onto the new, more
2237   sophisticated, revision of the Makefile. (Yes, this changes the
2238   "released" file if <tag> indicates a release. But it is an option.)
2239   
2240   - Important Note: If you rename a directory, you must rename the
2241   corresponding directory in every checked-out working directory. At the
2242   same time, you must edit the pathname stored in the ./CVS/Repository
2243   file within each of the moved directories.
2244   
2245   The easiest way to move a lot of directories around is to tell
2246   everyone to remove their working directories and check them out again
2247   from scratch.
2248   
2249   - The file exists in the working directory and in the ./CVS/Entries
2250   file, but not in the Repository. For the old file, "update" prints:
2251   
2252   cvs update: xyz.c is no longer in the repository
2253   
2254   and deletes the file. If the file was modified, "update" prints:
2255   
2256   cvs update: conflict: xyz.c is modified but no longer in the
2257   repository C xyz.c
2258   
2259   and leaves the file alone. In the new directory, you see:
2260   
2261   U xyz.c
2262   
2263   as you would if someone else executed "add" and "commit".
2264   
2265     For each file, copy the working file to a new name in the working
2266   directory and use the "cvs remove" to get rid of the old old file and
2267   "cvs add" to add the new one. Since there is no way for CVS to remove
2268   a directory, this only works for files.
2269   
2270   - This is what most people think of first. Without a "rename" command,
2271   the remove/add technique seems obvious.
2272   
2273   - You lose the connection of your new working file to its past
2274   revision history.
2275   
2276   Last modified: _6/13/1997_
2277   
2278    9. What are "Attic" directories? 
2279    
2280   When you use the "remove" command on a file, CVS doesn't delete the
2281   file, it only registers your desire to delete it.
2282   
2283   When you "commit" a removed file, CVS moves the Repository's matching
2284   RCS file into a sub-directory named "Attic" within the Repository.
2285   
2286   Attic files are examined when the '-r' or '-D' option is used on
2287   "checkout" or "update". If the specified revision, tag or date matches
2288   one on a file in the Attic, that file is checked out with the others.
2289   
2290   You can think of the Attic as a sort of dead branch, which is only
2291   looked at when you refer to a <tag> or <date>.
2292   
2293   Last modified: _6/13/1997_
2294   
2295    10. Is it OK to remove anything from the Repository? 
2296    
2297   In general, removing anything from the Repository is a bad idea. The
2298   information in a deleted object is lost forever. There are many ways
2299   to skip over files, directories and revisions without deleting them.
2300   
2301   Here are some of the consequences of removing the following things
2302   stored in the Repository:
2303   
2304     CVSROOT files (Repository control files)
2305   
2306   The Repository will work without any of them, but you should
2307   understand what you are losing by deleting them. See 4B.2.
2308   
2309     Revisions
2310   
2311   The only way to remove revisions is to use the "admin -o" command (or
2312   the equivalent RCS command "rcs -o").
2313   
2314   They are lost forever. Any tags formerly attached to deleted revisions
2315   are now pointing into the Phantom Zone. You'll need to contact Jor-el
2316   to get them back.
2317   
2318     Files
2319   
2320   You should not remove a file unless you truly never want to see it
2321   again. If you want to be able to check out an old revision of this
2322   file, use "cvs remove" instead.
2323   
2324     Tags
2325   
2326   Tags take up little space and you can't recover from deleting them. If
2327   you depend on tags for releases you will lose vital information.
2328   
2329     Directories
2330   
2331   There is no Attic for directories, so the only way to remove them is
2332   to use "rm -r". They are gone forever.
2333   
2334   If you delete (or move) a directory, all checked-out versions of that
2335   directory will cause CVS to halt. You'll have to visit each
2336   checked-out directory and remove the matching working directory by
2337   hand.
2338   
2339     Attic files
2340   
2341   The "remove" command sends files to the Attic. To really delete them,
2342   you have to go into the Attic and use "rm".
2343   
2344   If a file in the Attic has a Tag on it that you might ever want to
2345   check out again, you probably don't want to delete it.
2346   
2347     Lock files (named: "#cvs.[wr]fl.<pid>")
2348   
2349   These are lock files. If you are getting "lock" errors and the dates
2350   on the lock files indicate that they are old, you can delete them.
2351   
2352   Deleting lock files still in use by a CVS process might produce
2353   unusual errors.
2354   
2355   Last modified: _6/13/1997_
2356   
2357    11. Can I convert to CVS from RCS without losing my revision history? 
2358    
2359   Yes, you can simply move (or copy) your RCS files into a directory
2360   within the Repository, check out that directory and start working.
2361   
2362   Last modified: _6/13/1997_
2363   
2364    12. Can I move RCS files with branches in them into the Repository? 
2365    
2366   Yes, but they may not work if you created branches in a way that
2367   conflicts with CVS's assumptions:
2368   
2369     You can't use .0. branches. (They are reserved for "Magic" branch
2370   tags.)
2371   
2372     If you use branch 1.1.1, you can't use the Vendor branch.
2373   
2374   You can use other RCS branches under CVS. There is no need to create
2375   "magic" branch tags because the physical branch already exists.
2376   
2377   Last modified: _6/13/1997_
2378   
2379    13. Can I use raw RCS commands on the Repository? 
2380    
2381   You can use raw rcs commands directly on the Repository if you take a
2382   little care. The Repository itself contains no "CVS state" (as opposed
2383   to RCS revision histories) outside the CVSROOT directory.
2384   
2385   But using raw RCS commands to change branches, tags or other things
2386   that CVS depends on may render the files unusable.
2387   
2388   See 4D.7 on RCS/CVS sharing of the Repository and Section 3B on the
2389   "admin" command.
2390   
2391   Last modified: _6/13/1997_
2392   
2393    14. How do I convert from SCCS to RCS? 
2394    
2395   You'll have to execute something like "sccs2rcs" (in the CVS contrib
2396   directory) on every file. Then you can move the resulting RCS files
2397   into the Repository as described above.
2398   
2399   Last modified: _6/13/1997_
2400   
2401    15. How do I limit access to the Repository? 
2402    
2403   There are all sorts of ways to restrict access to Repository files,
2404   none of which are hooked directly into CVS.
2405   
2406   Techniques for limiting access include:
2407   
2408     Training, management and good backups.
2409   
2410   The best form of Repository control is a combination of:
2411   
2412   - A reliable backup scheme (verify it!)
2413   - Enough training to ensure your developers are competent and
2414   knowledgeable about all areas of your sources.
2415   - Effective management of the boundaries and grey areas.
2416   
2417   In many cases, technical solutions to "security" problems are
2418   inadequate. You should first try to avoid them.
2419   
2420   Personal Opinion: In an environment where "unknowns" are allowed to
2421   touch important sources the "owner" of the CVS Repository must be a
2422   large, loud, vigorous lout with a well-balanced truncheon and the
2423   right to use it. Don't underestimate the effectiveness of letting
2424   everyone know they will be strapped into the stocks on the Town Common
2425   and pelted with vegetables if they break something they don't
2426   understand without first asking the experts.
2427   
2428     Set Unix groups and permissions. See 4B.5. You can set different
2429   owners, groups and permissions for each sub-directory within the
2430   Repository if that helps.
2431   
2432     Catch invocations of "commit" by defining pre-commit programs in the
2433   "commitinfo" file. This is fairly powerful, since it can block commits
2434   based on anything you can program. Take a look at the programs in the
2435   "contrib" directory of the CVS source tree.
2436   
2437     Use multiple Repositories, each with its own protection scheme. If
2438   you use NFS (or AFS) you can even use "export" restrictions to various
2439   groups of machines to keep (for example) the Engineering Repository
2440   off the Customer Service machines.
2441   
2442     Try the "setgid" trick described in 4D.13.
2443   
2444     Try to use the RCS access control lists, though I don't think CVS
2445   will handle them cleanly.
2446   
2447     Edit the source code to CVS to add your own access control.
2448   
2449   Last modified: _6/13/1997_
2450   
2451    16. What are the Repository Administrator's responsibilities? 
2452    
2453   Generally, the Administrator should set "policy", create the
2454   Repository and monitor its size and control files.
2455   
2456   Some specific responsibilities include:
2457   
2458     Examining the Repository once in a while to clean up:
2459   
2460     Trash files left by misguided developers who mistake the Repository
2461   for a working directory.
2462   
2463     Non-RCS files. Other than the files CVS needs in the
2464   $CVSROOT/CVSROOT directory, every file in the Repository should be an
2465   RCS file.
2466   
2467     Lock files (both CVS '#*' and RCS ',*' files) left around after
2468   crashes.
2469   
2470     Wrong permissions, groups and ownerships.
2471   
2472     Locked files. (RCS locks, that is.)
2473   
2474     Attic files that should never have been under CVS at all. Don't
2475   blindly delete files from Attic directories -- they were mostly put
2476   there (via the "cvs remove") for a reason. Files that should be
2477   deleted are binary files (e.g. '*.o', 'core', executables) that were
2478   mistakenly inserted by "import -I !".
2479   
2480     Maintaining the modules file.
2481   
2482     Storing site-specific ignore patterns in the
2483   $CVSROOT/CVSROOT/cvsignore file.
2484   
2485     Storing the names of non-standard CVSROOT files (See 4B.2) in the
2486   $CVSROOT/CVSROOT/checkoutlist
2487   
2488     Maintaining the other Repository control files: commitinfo, loginfo,
2489   rcsinfo and editinfo.
2490   
2491     Pruning the history file every once in a while. (Try the
2492   "cln_hist.pl" script in the "contrib" directory.)
2493   
2494     Staying aware of developments on the info-cvs mailing list and what
2495   is available in the FTP and WWW archives.
2496   
2497     Running "ps ax" once in a while and kill off any "update" programs
2498   not running as "root". It is too easy to leave the "cvs" off the front
2499   of the "cvs update" command.
2500   
2501     Executing monitor programs to check the internal consistency of the
2502   Repository files. Ideas:
2503   
2504     Files that have a default RCS branch that is not 1.1.1 (From an
2505   abuse of "admin -b".)
2506   
2507     Files that have only Revisions 1.1 and 1.1.1.1, with a default
2508   branch of "MAIN". (From an abuse of "admin -o".)
2509   
2510     Existing branch tags and various branch consistency checks.
2511   
2512   Last modified: _6/13/1997_
2513   
2514    17. How do I move the whole Repository? 
2515    
2516   Copy or move the tree. (On Unix systems, a set of piped "tar" commands
2517   works great. If the Repository does not contain any symlinks, which it
2518   normally doesn't, you can also use "cp -r".)
2519   
2520   If you can avoid changing $CVSROOT (i.e. the "logical" pathname of the
2521   Repository) by replacing the old location with a symbolic link to the
2522   new location, you don't have to do anything else.
2523   
2524   (You could also mount the new location on top of the old location if
2525   you are using NFS or some other filesystem that allows it.)
2526   
2527   If you must change $CVSROOT, you must also tell everyone to change the
2528   CVSROOT environment variable in all running shells and in any personal
2529   configuration files ('.' files on Unix) where it is set.
2530   
2531   The Repository itself contains no references to its own name, except
2532   possibly in some of the files in the CVSROOT directory. If your
2533   modules (or loginfo, commitinfo, etc.) file mentions helper programs
2534   directly in the Repository, you'll have to change the pathnames to
2535   point to the new Repository location.
2536   
2537   The main changes you'll have to make are to all the CVS administrative
2538   files (./CVS/Repository and ./CVS/Root) in every working directory
2539   ever checked out from the previous location of the Repository you just
2540   moved.
2541   
2542   You have three choices:
2543   
2544     If all ./CVS/Repository files in all working directories contain
2545   relative pathnames, you don't have to do anything else.
2546   
2547     Have everyone "release" or delete their working directories (after
2548   committing, or just saving, their work) and check them all out again
2549   from the new Repository after the move.
2550   
2551     Use "find . ( -name Repository -o -name Root )" and a PERL or shell
2552   script to run through all the ./CVS/Repository and ./CVS/Root files
2553   and edit the values in the files.
2554   
2555   Last modified: _6/13/1997_
2556   
2557    18. How do I change permissions on a file in the Repository by using a CVS
2558    command? (i.e. without using "chmod 777 $CVSROOT/dir/file") 
2559    
2560   When you first "import" or "add"/"commit" a file, the read and execute
2561   bits on the Repository file are inherited from the original source
2562   file, while the write bits on the Repository file are are turned off.
2563   This is a standard RCS action.
2564   
2565   After that, there is no way to alter the permissions on a file in the
2566   Repository using CVS (or RCS) commands. You have to change the
2567   permissions on both your working file and on the Repository file from
2568   which it was retrieved.
2569   
2570   Whenever you "checkout" the file or retrieve a new revision via
2571   "update" (or after a "commit"), your working file is set to match the
2572   permissions of the Repository file, minus any "umask" bits you have
2573   set.
2574   
2575   Last modified: _6/13/1997_
2576   
2577  Category: /Advanced_Topics_/Tricks_of_the_Trade/
2578  
2579   " + Tricks of the Trade"
2580   
2581    1. How can you even check in binary files, let alone allow CVS to do its
2582    auto-merge trick on them? 
2583    
2584
2585First of all, if you want to use binary files, you should get RCS 5.7
2586and CVS 1.9 or later (earlier versions had some support, but there have been
2587bug fixes).  Secondly, follow the instructions for installing RCS very
2588carefully (it is easy to get it installed so it works for everything
2589except binary files).
2590
2591Then, specify 'cvs add -kb' instead of just 'cvs add' to add a binary
2592file.  If you want to set an existing file to binary, run 'cvs admin
2593-kb' (and then check in a new copy of the file).  Note that old
2594versions of CVS used -ko instead of -kb for binary files, so if you
2595see a reference to -ko in the context of binary files, you should
2596think -kb instead.
2597
2598Of course when 'cvs update' finds that a merge is needed, it can't
2599do this for binary files the same way as for text files.  With the
2600latest versions (e.g. CVS 1.9.14), it should be able to give you both
2601versions and let you merge manually.  Another approach is to
2602run 'cvs admin -l' to lock files, as described in
2603"How can I lock files while I'm working on them the way RCS does?"
2604elsewhere in this FAQ.  See also
2605"Is there any way to import binary files?" and
2606"How do I "add" a binary file?" elsewhere in this FAQ.
2607
2608kingdon@cyclic.com
2609
2610   Last modified: _9/6/1997_
2611   
2612    2. Can I edit the RCS (",v") files in the Repository? 
2613    
2614   Yes, but be very careful. The RCS files are not free-form files, they
2615   have a structure that is easily broken by hand-editing. The only time
2616   I would suggest doing this is to recover from emergency failures that
2617   are difficult to deal with using CVS commands, including the "admin"
2618   command, which can talk directly to RCS.
2619   
2620   Though no one actively encourages the editing of RCS files, many
2621   people have succumbed to the urge to do so when pressed for time. The
2622   reasons given, usually with evident contrition, include:
2623   
2624   - Editing mistakes in, or adding text to, log entries. (If you have
2625   RCS 5.6 or later, you should use `cvs admin -m'.)
2626   - Renaming or moving symbolic names. (You should `cvs admin -N'
2627   instead.)
2628   - Unlocking a file by changing the "locker" from someone else to
2629   yourself. (It's safer to use `cvs admin -u -l'.)
2630   - Making global changes to past history. Example: Eradicating former
2631   employees names from old documents and Author entries. (And someone
2632   thought the "history" command was evidence of Big Brother! I never
2633   realized how much help a wide-open revision control system could have
2634   provided to The Ministry of Truth.)
2635   
2636   Last modified: _6/13/1997_
2637   
2638    3. Can I edit the ./CVS/{Entries,Repository,Tag} files? 
2639    
2640   Yes, but with CVS 1.3 and later, there is almost no reason to edit any
2641   of the CVS administrative files.
2642   
2643   If you move pieces of your Repository around it can be faster to edit
2644   all the ./CVS/Repository files rather than checking out a large tree.
2645   But that is nearly the only reason to do so.
2646   
2647   Last modified: _6/13/1997_
2648   
2649    4. Someone executed "admin -o" and removed revisions to which tags/symbols
2650    were attached. How do I fix them? 
2651    
2652   It depends on what you mean by "fix". I can think of three ways to fix
2653   your predicament:
2654   
2655     Remove the tags.
2656   
2657   Assuming you really wanted to get rid of the revision and its
2658   associated tags, you can remove them with the "admin" command. The
2659   "tag -d" command will only remove tags attached to existing revisions.
2660   You can remove a tag, even if it is attached to a non-existent
2661   revision, by typing:
2662   
2663                cvs admin -N<tag> <file>
2664
2665     Retrieve the outdated revision.
2666   
2667   You should first look in your backup system for recent versions of the
2668   file. If you can't use them, you can carefully extract each revision
2669   that followed the earliest outdated revision using RCS (or "cvs
2670   admin") commands and reconstruct the file with all the right
2671   revisions, branches and tags. This is a lot of work.
2672   
2673   You *can't* insert a revision into the current RCS file.
2674   
2675     Move the Tags to another revision in each file.
2676   
2677   If you want to move the tags to another valid revision, you have two
2678   choices, both of which require that you find all the revision numbers
2679   of the files you want to "tag" and execute the following command
2680   sequences on each <file>.
2681   
2682     Use "update" to grab the revision you want, then execute a normal
2683   "tag" command to Tag that revision:
2684   
2685                        cvs update -r <rev> <file>
2686                        cvs tag <tag> <file>
2687
2688     Use "admin" to set the tag to a specific revision:
2689   
2690                        cvs admin -N<tag>:<rev> <file>
2691
2692   Last modified: _6/13/1997_
2693   
2694    5. How do I move or rename a magic branch tag? 
2695    
2696   (To rename a non-branch <tag> see 3O.9.)
2697   
2698   Before reading this, read 3M.3 and 3M.4 and understand exactly how tag
2699   and rtag use '-r' and why it won't do the right job here.
2700   
2701     First, I have to explain exactly what a magic branch tag is.
2702   
2703   A magic <branch_tag> is an artificial tag attached to a non-existent
2704   revision on a non-existent branch number zero. It looks like this:
2705   
2706                TAG1:<X>.0.Y
2707
2708   <X> is the "branch point revision", a normal revision with an
2709                odd number of '.'s in it. (e.g. 1.5, 1.3.1.6, etc)
2710
2711             Y  is an even number (e.g. 2, 4, 6, etc.)  All CVS branches,
2712                other than the Vendor branch, are even numbered.
2713
2714   TAG1 is considered by CVS to be attached to revision <X>. The first
2715   "update -r TAG1 <file>" after applying TAG1 will produce a copy of
2716   revision <X> with a sticky tag of TAG1. The first "commit" to that
2717   file will cause CVS to construct an RCS branch named <X>.Y and check
2718   in revision <X>.Y.1 on the new branch.
2719   
2720   Note: TAG1 is *not* considered to be attached to <X> by RCS, which
2721   explains why you can't refer directly to the branch point revision for
2722   some CVS commands.
2723   
2724     Moving a magic <branch_tag> is the act of reapplying the same tag to
2725   different revisions in the file:
2726   
2727                TAG1:<X>.0.Y
2728           to
2729                TAG1:<X>.0.Z    or      TAG1:<A>.0.B
2730
2731   You can move a magic branch tag to the revisions of your choice by
2732   using "update" to find the revisions you want to tag and reapplying
2733   the tag to all the files with the '-F' option to force it to move the
2734   existing <branch_tag>.
2735   
2736                cvs update -r <tag/rev>  (or '-A' for the Main Branch)
2737                cvs tag -F -b <branch_tag>
2738
2739   If the earlier location of TAG1 refers to a physical branch within any
2740   RCS file, moving it will make the existing branch in the file seem to
2741   disappear from CVS's view. This is not a good idea unless you really
2742   want to forget the existence of those RCS branches.
2743   
2744   If the "update" above retrieves the original branch point revision
2745   (<X>), the "tag" command above will create the tag:
2746   
2747                TAG1:<X>.0.Z
2748
2749   Where Z is 2 greater than the highest magic branch already on revision
2750   <X>. The TAG1 branch will still have the same branch point (i.e.
2751   revision <X>), but the first commit to the new TAG1 branch will create
2752   a different RCS branch number (<X>.Z instead of <X>.Y).
2753   
2754     Renaming a magic <branch_tag> is the act of changing
2755   
2756                TAG1:<X>.0.Y
2757           to
2758                TAG2:<X>.0.Y
2759
2760   There is no harm in changing a tag name as long as you forget that
2761   TAG1 ever existed and you clean up any working directories with sticky
2762   TAG1 tags on them by using "update -A", "update -r <other_tag>" or by
2763   removing the working directories.
2764   
2765   On the other hand, actually changing the tag is not easy.
2766   
2767   See 3M.3 for why the seemingly obvious solution won't work:
2768   
2769                cvs tag -b -r <old_branch_tag> <new_branch_tag>
2770
2771   The only direct way to rename a magic tag is to use the "admin"
2772   command on each file: (You might want to use '-n'. Read "man rcs" and
2773   look at the '-n' and '-N' options.)
2774   
2775                cvs admin -N<new_branch_tag>:<old_branch_tag> .
2776                cvs tag -d <old_branch_tag>
2777
2778   But you have to be careful because "admin" is different from other CVS
2779   commands:
2780   
2781     "admin" can be used recursively, but only by specifying directory
2782   names in its argument list (e.g. '.'),
2783   
2784     Where "rtag -r <old_branch_tag>" would interpret <old_branch_tag> as
2785   a magic CVS branch tag, "admin" is a direct interface to RCS which
2786   sees a magic branch tag as a simple (though non-existent) RCS revision
2787   number.
2788   
2789   This is good for us in this particular case, but different from normal
2790   CVS.
2791   
2792     "admin" also skips the Attic and produces different kinds of errors
2793   than CVS usually does. (Because they are coming directly from RCS.)
2794   
2795   The other way to rename a magic <branch_tag> is to edit the Repository
2796   files with a script of some kind. I've done it in the past, but I'll
2797   leave it as an exercise for the reader.
2798   
2799   Last modified: _6/13/1997_
2800   
2801    6. Can I use RCS locally to record my changes without making them globally
2802    visible by committing them? 
2803    
2804   You can, but it will probably confuse CVS to have ",v" files in your
2805   working directory. And you will lose all your log entries when you
2806   finally commit it.
2807   
2808   Your best bet is to create your own CVS branch and work there. You can
2809   commit as many revisions as you want, then merge it back into the main
2810   line (or parent branch) when you are finished.
2811   
2812   Last modified: _6/13/1997_
2813   
2814    7. How can I allow access to the Repository by both CVS and RCS? 
2815    
2816   The first step is to try not to. If some people are using CVS, there
2817   is no reason for everyone not to. It is not hard to learn the basics
2818   and CVS makes certain operations *easier* than a series of RCS
2819   commands. Personal preference in what software tools can be applied to
2820   a shared Repository has to take second place to system integration
2821   needs. If you disagree, try writing some Lisp code for inclusion in
2822   your Unix kernel and see what kind of reception you get.
2823   
2824   If you really must allow routine RCS access to the CVS Repository, you
2825   can link an RCS sub-directory into a piece of the Repository:
2826   
2827                ln -s /Repository/some/directory/I/want RCS
2828
2829   and RCS will work just fine.
2830   
2831   Those who are using RCS will have to keep the following in mind:
2832   
2833     If a file was originally added to the Repository by "import" and has
2834   not been changed using CVS, the *RCS* default branch will remain
2835   attached to the Vendor branch, causing revisions checked-in by "ci" to
2836   wind up on the Vendor branch, instead of the main branch. Only CVS
2837   moves the RCS default branch on first commit.
2838   
2839   The way around this is to checkin (using "ci") all the files first and
2840   move them into the Repository. That way they won't have Vendor
2841   branches. Then RCS will work OK.
2842   
2843     It is possible to use "rcs" and "ci" to make the files unusable by
2844   CVS. The same is true of the CVS "admin" command.
2845   
2846     Normal RCS practice locks a file on checkout with "co -l". In such
2847   an environment, RCS users should plan to keep survival gear and food
2848   for at least 30 days near their desks. When faced with bizarre and
2849   unexpected permission errors, howling mobs of slavering CVS users will
2850   run the RCS users out of town with pitchforks and machetes.
2851   
2852   See 3C.8 for a way to avoid machetes aroused by lock collisions.
2853   
2854     Though files checked in by RCS users will correctly cause
2855   "up-to-date" failures during CVS "commits" and they will be
2856   auto-merged into CVS working directories during "update", the opposite
2857   won't happen.
2858   
2859   RCS users will get no warning and will not be required to merge older
2860   work into their code. They can easily checkin an old file on top of a
2861   new revision added by CVS, discarding work committed earlier by CVS
2862   users.
2863   
2864   See the howling mob scenario described above.
2865   
2866   RCS is great. I have used it for years. But I wouldn't mix it this
2867   way. In a two-camp society, you are asking for real trouble, both in
2868   technical hassles to clean up and in political hassles to soothe.
2869   Branch merges will also be a major problem.
2870   
2871   Last modified: _6/13/1997_
2872   
2873    8. I "updated" a file my friend, "bubba", committed yesterday. Why doesn't
2874    the file now have a modified date of yesterday? 
2875    
2876   CVS restores dates from the RCS files only on first "checkout". After
2877   that, it is more important to maintain a timestamp relative to the
2878   other files in the working directory.
2879   
2880   Example: You committed a source file at 5PM. Bubba updated his copy of
2881   the file, grabbing your changes, then changed and committed a new
2882   revision of the file at 6PM. At 7PM, you compile your file. Then you
2883   execute "update". If CVS sets the date to the one in the RCS file, the
2884   file would be given a timestamp of 6PM and your Makefile wouldn't
2885   rebuild anything that depended on it. Bad news.
2886   
2887   Note that the same logic applies to retrieving a revision out of the
2888   Repository to replace a deleted file. If CVS changes your file in an
2889   existing working directory, whether it was because a new revision was
2890   committed by someone else or because you deleted your working file,
2891   the timestamp on the retrieved working file *must* be set to the
2892   current time.
2893   
2894   When you first retrieve a file, there is no reason to expect any
2895   particular timestamp on the file within your working area. But later,
2896   when dependency checking is performed during a build, it is more
2897   important for the timestamps on the local files to be consistent with
2898   each other than than it is for working files to match the timestamps
2899   on the files in the Repository. See 4D.17 for some more about
2900   timestamps.
2901   
2902   Last modified: _6/13/1997_
2903   
2904    9. Why do timestamps sometimes get set to the date of the revision,
2905    sometimes not? The inconsistency causes unnecessary recompiles. 
2906    
2907   The "checkout" command normally sets the timestamp of a working file
2908   to match the timestamp stored on the revision in the Repository's RCS
2909   file.
2910   
2911   The "commit" command retains the timestamp of the file, if the act of
2912   checking it in didn't change it (by expanding keywords).
2913   
2914   The "update" command sets the time to the revision time the first time
2915   it sees the file. After that, it sets the time of the file to the
2916   current time. See 4D.8 for a reason why.
2917   
2918   Here's a two-line PERL program to set timestamps on files based on
2919   other timestamps. I've found this program useful. When you are certain
2920   you don't want a source file to be recompiled, you can set its
2921   timestamp to the stamp on the object file.
2922   
2923        #!/usr/local/bin/perl
2924        #
2925        # Set timestamp of args 2nd-Last to that of the first arg.
2926        #
2927        ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime)
2928                = stat(shift);
2929        utime($atime,$mtime,@ARGV);
2930
2931   Last modified: _6/13/1997_
2932   
2933    10. While in the middle of a large "commit", how do I run other commands,
2934    like "diff" or "stat" without seeing lock errors? 
2935    
2936   Type:
2937                cvs -n <command>
2938
2939   The '-n' option to the main cvs command turns off lock checking, a
2940   reasonable act for read-only commands given the promise offered by
2941   '-n' not to alter anything. The "diff", "log" and "stat" commands
2942   provide the same information (for files that are not being committed)
2943   when used with and without the '-n' option.
2944   
2945   Warning: Ignoring locks can produce inconsistent information across a
2946   collection of files if you are looking at the revisions affected by an
2947   active commit. Be careful when creating "patches" from the output of
2948   "cvs -n diff". If you are looking only at your working files, tagged
2949   revisions, and BASE revisions (revisions whose numbers are read from
2950   your ./CVS/Entries files), you should get consistent results. Of
2951   course, if you catch a single file in the middle of RCS activity, you
2952   might get some strange errors.
2953   
2954   Note that the suggested command is "cvs -n <command>". The visually
2955   similar command "cvs <command> -n" has no relation to the suggested
2956   usage and has an entirely different meaning for each command.
2957   
2958   "cvs -n update" also works in the middle of a commit, providing
2959   slightly different information from a plain "cvs update". But, of
2960   course, it also avoids modifying anything.
2961   
2962   You could also use the RCS functions, "rlog" and "rcsdiff" to display
2963   some of the information by referring directly to the Repository files.
2964   
2965   You need RCS version 5 or later for the commands described above to
2966   work reliably.
2967   
2968   Last modified: _6/13/1997_
2969   
2970    11. Where did the ./CVS/Entries.Static file come from? What is it for? 
2971    
2972   Each CVS working directory contains a ./CVS/Entries file listing the
2973   files managed by CVS in that working directory. Normally, if the
2974   "update" command finds a file in the Repository that is not in the
2975   ./CVS/Entries file, "update" copies the appropriate revision of the
2976   "new" file out of the Repository and adds the filename to the Entries
2977   file. This happens for files:
2978   
2979     Added to the Repository from another working directory.
2980   
2981     Dragged out of the Attic when switching branches with "update -A" or
2982   "update -r".
2983   
2984     Whose names were deleted from the ./CVS/Entries file.
2985   
2986   If the ./CVS/Entries.Static file exists, CVS will only bring out
2987   revisions of files that are contained in either ./CVS/Entries or
2988   ./CVS/Entries.Static. If a Repository file is found in *neither* file,
2989   it is ignored.
2990   
2991   The ./CVS/Entries.Static file is created when you check out an
2992   individual file or a module that creates working directories that
2993   don't contain all files in the corresponding Repository directory. In
2994   those cases, without an ./CVS/Entries.Static file, a simple "update"
2995   would bring more files out of the Repository than the original
2996   "checkout" wanted.
2997   
2998   The ./CVS/Entries.Static file can be removed by hand. It is
2999   automatically removed if you run "update -d" to create new directories
3000   (even if no new directories are created). (Internally, since
3001   "checkout" turns on the '-d' flag and calls the "update" routine, a
3002   "checkout" of a module or directory that writes into an existing
3003   directory will also remove the ./CVS/Entries.Static file.)
3004   
3005   Last modified: _6/13/1997_
3006   
3007    12. Why did I get the wrong Repository in the loginfo message? 
3008    
3009   You probably:
3010   
3011     Use multiple Repositories.
3012   
3013     Configured CVS to use absolute pathnames in the ./CVS/Repository
3014   file.
3015   
3016     Configured CVS not to use the ./CVS/Root file.
3017   
3018     Typed the "commit" command in one Repository with your $CVSROOT
3019   pointing at another.
3020   
3021   "commit" and all other CVS commands will heed an absolute pathname in
3022   the ./CVS/Repository file (or in the "-d CVSrootdir" override), but
3023   the log function doesn't take arguments -- it just looks at $CVSROOT.
3024   
3025   If you avoid even one of the four steps above, you won't see this
3026   problem. If you configure ./CVS/Root, you won't be allowed to execute
3027   the program causing the error.
3028   
3029   Last modified: _6/13/1997_
3030   
3031    13. How do I run CVS setuid so I can only allow access through the CVS
3032    program itself? 
3033    
3034   Setuid to root is not a great idea. Any program that modifies files
3035   and is used by a widely distributed group of users is not a good
3036   candidate for a setuid program. (The worst suggestion I've ever heard
3037   was to make *Emacs* setuid to root.)
3038   
3039   Root access on Unix is too powerful. Also, it might not work in some
3040   (secure?) environments.
3041   
3042   Running it setuid to some user other than root might work, if you add
3043   this line to main.c near the beginning:
3044   
3045                setuid(geteuid());
3046
3047   Otherwise it uses *your* access rights, rather than the effective
3048   uid's.
3049   
3050   Also, you have to invent a fake user whose name will show up in
3051   various places. But many sites, especially those who might want a
3052   setuid CVS for "security", want personal accountability -- no generic
3053   accounts. I don't know whether accountability outweighs file security.
3054   
3055   And finally, unless you take action to limit the "admin" command, you
3056   are leaving yourself unprotected anyway.
3057   
3058   Last modified: _6/13/1997_
3059   
3060    14. How about using groups and setgid() then? 
3061    
3062   Here is a way to run CVS setgid in some environments:
3063   
3064     Stick this near the front of the main() in main.c:
3065   
3066   setgid(getegid());
3067   
3068   This will allow "access" to work on systems where it only works on the
3069   real gid.
3070   
3071     Create a group named "cvsg". (This example uses "cvsg". You can name
3072   it as you wish.)
3073   
3074     Put *no* users in the "cvsg" group. You can put Repository
3075   administrators in this group if you want to.
3076   
3077     Set the cvs executable to setgid (not setuid):
3078   
3079   cd /usr/local/bin; chown root.cvsg cvs; chmod 2755 cvs
3080   
3081     Make sure every file in the Repository is in group "cvsg":
3082   
3083   chown -R root.cvsg $CVSROOT
3084   
3085     Change all directory permissions to 770. This allows all access to
3086   the files by the "cvsg" group (which has no members!) and no access at
3087   all to anyone else.
3088   
3089   find $CVSROOT -type d -exec chmod 2770 {} \;
3090   
3091   On some systems you might have to type:
3092   
3093   find $CVSROOT -type d -exec chmod u=rwx,g=rwx,o=,g+s {} \;
3094   
3095   This should allow only the cvs program (or other "setgid to group
3096   cvsg") programs to write into the area, but no one else. Yes the user
3097   winds up owning the file, but s/he can't find it again later since
3098   s/he can't traverse the tree. (If you enable the world execute bit
3099   (mode 2771) on directories, users can traverse the tree and the user
3100   who last wrote the file can still write to it.)
3101   
3102   If you want to allow read access, check out an entire tree somewhere.
3103   You have to do this anyway to build it.
3104   
3105   Note: If you are using a stupid file system that can't inherit file
3106   groups from the parent directory (even with the "setgid" (Octal 2000)
3107   bit set), you might have to modify CVS (or RCS) to reset the group
3108   every time you create a new file. I have not tested this.
3109   
3110   The setgid() method shares with the setuid() method the problem of
3111   keeping "admin" from breaking things.
3112   
3113   Last modified: _6/13/1997_
3114   
3115    15. How do I use the "commitinfo" file? 
3116    
3117   Go read 4B.2 first.
3118   
3119   The "commitinfo" file allows you to execute "sanity check" functions
3120   before allowing a commit. If any function called from within the
3121   commitinfo file exits with a non-zero status, the commit is denied.
3122   
3123   To fill out a "commitinfo" file, ask yourself (and those sharing your
3124   Repository) these questions:
3125   
3126   - Is there anything you want to check or change before someone is
3127   allowed to commit a file? If not, forget commitinfo.
3128   
3129   If you want to serialize binary files, you might consider something
3130   like the rcslock.pl program in the contrib directory of the CVS
3131   sources.
3132   
3133   - Do you want to execute the same exact thing before committing to
3134   every file in the Repository? (This is useful if you want to program
3135   the restrictions yourself.) If so, set up a single line in the
3136   commitinfo:
3137   
3138                DEFAULT         /absolute/path/to/program
3139
3140   CVS executes the program once for each directory that "commit"
3141   traverses, passing as arguments the directory and the files to be
3142   committed within that directory.
3143   
3144   Write your program accordingly. Some examples exist in the contrib
3145   directory.
3146   
3147   - Do you want a different kind of sanity check performed for different
3148   directories? If so, you'll have to decide what to do for all
3149   directories and enter lines like this:
3150   
3151                regexp1         /absolute/path/to/program-for-regexp1
3152                regexp2         /absolute/path/to/program-for-regexp2
3153                DEFAULT         /absolute/path/to/program-for-all-else
3154
3155   - Is there anything you want to happen before *all* commits, in
3156   addition to other pattern matches? If so, include a line like this:
3157   
3158                ALL             /absolute/path/to/program
3159
3160   It is executed independently of all the above. And it's repeatable --
3161   you can have as many ALL lines as you like.
3162   
3163   Last modified: _6/13/1997_
3164   
3165    16. How do I use the "loginfo" files? 
3166    
3167   See 4B.2 and the "commitinfo" question above.
3168   
3169   The "loginfo" file has the same format as the "commitinfo" file, but
3170   its function is different. Where the "commitinfo" information is used
3171   before a commit, the "loginfo" file is used after a commit.
3172   
3173   All the commands in the "loginfo" file should read data from standard
3174   input, then either append it to a file or send a message to a mailing
3175   list. If you want to make it simple, you can put shell (the shell used
3176   by "popen(3)") command lines directly in the "loginfo" (or
3177   "commitinfo") file. These seem to work:
3178   
3179   ^special /usr/ucb/Mail -s %s special-mailing-list ^other /usr/ucb/Mail
3180   -s %s other-mailing-list DEFAULT (echo '===='; echo %s; cat) >
3181   /path/name/to/log/file
3182   
3183   Last modified: _6/13/1997_
3184   
3185    17. How can I keep people with restrictive umask values from blocking
3186    access to the Repository? 
3187    
3188   If a user creates a new file with restricted permissions (e.g. 0600),
3189   and commits it, the Repository will have a file in it that is
3190   unreadable by everyone. The 0600 example would be unreadable by
3191   *anyone* but root and the user who created it.
3192   
3193   There are 3 solutions to this:
3194   
3195     Let it happen. This is a valid way to protect things. If everyone is
3196   working alone, a umask of 077 is OK. If everyone is working only in
3197   small groups, a umask of 007 is OK.
3198   
3199     Train your users not to create such things if you expect to share
3200   them.
3201   
3202     See 4B.5 for a small script that will reset the umask.
3203   
3204   I personally don't like the idea of a program automatically
3205   *loosening* security. It would be better for you all to talk about the
3206   issue and decide how to work together.
3207   
3208   Last modified: _6/13/1997_
3209   
3210  Category: /Commands_/
3211  
3212   " Commands "
3213   
3214  Category: /Commands_/add_ad_new/
3215  
3216   " + "add", "ad", "new""
3217   
3218    1. What is "add" for? 
3219    
3220   To add a new directory to the Repository or to register the desire to
3221   add a new file to the Repository.
3222   
3223   The directory is created immediately, while the desire to add the file
3224   is recorded in the local ./CVS administrative directory. To really add
3225   the file to the Repository, you must then "commit" it.
3226   
3227   Last modified: _6/13/1997_
3228   
3229    2. How do I add a new file to the branch I'm working on? 
3230    
3231   The user actions for adding a file to any branch, including the Main
3232   Branch, are exactly the same.
3233   
3234   You are in a directory checked out (or updated) with the '-A' option
3235   (to place you on the Main Branch) or the "-r <branch_tag>" option (to
3236   place you on a branch tagged with <branch_tag>). To add <file> to the
3237   branch you are on, you type:
3238   
3239                cvs add <file>
3240                cvs commit <file>
3241
3242   If no ./CVS/Tag file exists (the '-A' option deletes it), the file
3243   will be added to the Main Branch. If a ./CVS/Tag file exists (the "-r
3244   <branch_tag>" option creates it), the file will be added to the branch
3245   named (i.e. tagged with) <branch_tag>.
3246   
3247   Unless you took steps to first add the file to the Main Branch, your
3248   new file ends up in the Attic.
3249   
3250   Last modified: _6/13/1997_
3251   
3252    3. Why did my new file end up in the Attic? 
3253    
3254   The file is thrown into the Attic to keep it from being visible when
3255   you check out the Main Branch, since it was never committed to the
3256   Main Branch.
3257   
3258   Last modified: _6/13/1997_
3259   
3260    4. Now that it's in the Attic, how do I connect it to the Main branch? 
3261    
3262   That can be considered a kind of "merge". See 4C.8
3263   
3264   Last modified: _6/13/1997_
3265   
3266    5. How do I avoid the hassle of reconnecting an Attic-only file to the Main
3267    Branch? 
3268    
3269   You create it on the Main Branch first, then branch it.
3270   
3271   If you haven't yet added the file or if you decided to delete the new
3272   Attic file and start over, then do the following: (If you added the
3273   file (or worse, the 157 files) to the Attic and don't want to start
3274   over, try the procedure in 4C.8.)
3275   
3276     Temporarily remove the sticky branch information. Either:
3277   
3278     Move the whole directory back to the Main Branch. [This might not be
3279   a good idea if you have modified files, since it will require a merge
3280   in each direction.]
3281   
3282                cvs update -A
3283
3284                        *or*
3285
3286     Move the ./CVS/Tag file out of the way.
3287   
3288                mv ./CVS/Tag HOLD_Tag
3289
3290     Add and branch the file "normally":
3291   
3292                cvs add <file>
3293                cvs commit <file>
3294                cvs tag -b <branch_tag> <file>
3295
3296   [<branch_tag> is the same Branch Tag as you used on all the other
3297   files. Look at ./CVS/Entries or the output from "cvs stat" for sticky
3298   tags.]
3299   
3300     Clean up the temporary step.
3301   
3302     If you moved the ./CVS/Tag file, put it back. Then move the new file
3303   onto the branch where you are working.
3304   
3305                mv HOLD_Tag ./CVS/Tag
3306                cvs update -r <branch_tag> <file>
3307
3308     If you ran "update -A" rather than moving the ./CVS/Tag file, move
3309   the whole directory (including the new file) back onto the branch
3310   where you were working:
3311   
3312                cvs update -r <branch_tag>
3313
3314   Last modified: _6/13/1997_
3315   
3316    6. How do I cancel an "add"? 
3317    
3318   If you want to remove the file entirely and cancel the "add" at the
3319   same time, type:
3320   
3321                cvs remove -f <file>
3322
3323   If you want to cancel the "add", but leave the file as it was before
3324   you typed "cvs add", then you have to fake it:
3325   
3326                mv <file> <file>.hold
3327                cvs remove <file>
3328                mv <file>.hold <file>
3329
3330   Last modified: _6/13/1997_
3331   
3332    7. What are the ./CVS/file,p and ./CVS/file,t files for? 
3333    
3334   The ./CVS/file,p and ./CVS/file,t files are created by the "add"
3335   command to hold command line options and message text between the time
3336   of the "add" command and the expected "commit".
3337   
3338   The ./CVS/file,p file is always null, since its function was absorbed
3339   by the "options" field in the ./CVS/Entries file. If you put something
3340   in this file it will be used as arguments to the RCS "ci" command that
3341   commit uses to check the file in, but CVS itself doesn't put anything
3342   there.
3343   
3344   The ./CVS/file,t file is null unless you specify an initial message in
3345   an "add -m 'message'" command. The text is handed to "rcs -i
3346   -t./CVS/file,t" to create the initial RCS file container.
3347   
3348   Both files must exist to commit a newly added file. If the
3349   ./CVS/file,p file doesn't exist, CVS prints an error and aborts the
3350   commit. If the ./CVS/file,t file doesn't exist, RCS prints an error
3351   and CVS gets confused, but does no harm.
3352   
3353   To recover from missing ,p and ,t files, just create two zero-length
3354   files and rerun the "commit".
3355   
3356   Last modified: _6/13/1997_
3357   
3358    8. How do I "add" a binary file? 
3359    
3360   If you configured CVS to use the GNU version of "diff" and "diff3",
3361   you only need to turn off RCS keyword expansion.
3362   
3363   First you turn off RCS keyword expansion for the initial checkin by
3364   using "add -ko". It works like "update -ko" in creating a "sticky"
3365   option only for the copy of the file in the current working directory.
3366   
3367                cvs add -ko <file>
3368
3369   Commit the file normally. The sticky -ko option will be used.
3370   
3371                cvs commit <file>
3372
3373   Then mark the RCS file in the Repository so that keyword expansion is
3374   turned off for all checked out versions of the file.
3375   
3376                cvs admin -ko <file>
3377
3378   Since "admin -ko" records the keyword substitution value in the
3379   Repository's RCS file, you no longer need the sticky option. You can
3380   turn it off with the "update -A" command, but if you were on a branch,
3381   you'll have to follow it "update -r <branch_tag>" to put yourself back
3382   on the branch.
3383   
3384   Managing that binary file is another problem. See 4D.1.
3385   
3386   Last modified: _6/13/1997_
3387   
3388  Category: /Commands_/admin_adm_rcs/
3389  
3390   " + "admin", "adm", "rcs""
3391   
3392    1. What is "admin" for? 
3393    
3394   To provide direct access to the underlying "rcs" command (which is not
3395   documented in this FAQ) bypassing all safeguards and CVS assumptions.
3396   
3397   Last modified: _6/13/1997_
3398   
3399    2. Wow! Isn't that dangerous? 
3400    
3401   Yes.
3402   
3403   Though you can't hurt the internal structure of an RCS file using its
3404   own "rcs" command, you *can* change the underlying RCS files using
3405   "admin" in ways that CVS can't handle.
3406   
3407   If you feel the need to use "admin", create some test files with the
3408   RCS "ci" command and experiment on them with "rcs" before blasting any
3409   CVS files.
3410   
3411   Last modified: _6/13/1997_
3412   
3413    3. What would I normally use "admin" for? 
3414    
3415   Normally, you wouldn't use admin at all. In unusual circumstances,
3416   experts can use it to set up or restore the internal RCS state that
3417   CVS requires.
3418   
3419   You can use "admin -o" (for "outdate") to remove revisions you don't
3420   care about. This has its own problems, such as leaving dangling Tags
3421   and confusing the "update" command.
3422   
3423   There is some feeling among manipulators of binary files that "admin
3424   -l" should be used to serialize access. See 3C.8.
3425   
3426   An interesting use for "admin" came up while maintaining CVS itself. I
3427   import versions of CVS onto the Vendor branch of my copy of CVS, make
3428   changes to some files and ship the diffs (created by "cvs diff -c -r
3429   TO_BRIAN") off to Brian Berliner. After creating the diff, I retag
3430   ("cvs tag -F TO_BRIAN") the working directory, which is then ready to
3431   produce the next patch.
3432   
3433   I'll use "add.c" as an example (only because the name is short).
3434   
3435   When the next release came out, I discovered that the released "add.c"
3436   (version 1.1.1.3 on the Vendor branch) was exactly the same as my
3437   modified file (version 1.3). I didn't care about the changelog on
3438   versions 1.2 and 1.3 (or the evidence of having done the work), so I
3439   decided to revert the file to the state where it looked like I had not
3440   touched the file -- where I was just using the latest on the vendor
3441   branch after a sequence of imports.
3442   
3443   To do that, I removed all the revisions on the main branch, except for
3444   the original 1.1 from which the Vendor branch sprouts:
3445   
3446                cvs admin -o1.2: add.c
3447
3448   Then I set the RCS "default branch" back to the Vendor branch, the way
3449   import would have created it:
3450   
3451                cvs admin -b1.1.1 add.c
3452
3453   And I moved the "TO_BRIAN" Tag to the latest revision on the Vendor
3454   branch, since that is the base from which further patches would be
3455   created (if I made any):
3456   
3457                cvs admin -NTO_BRIAN:1.1.1.3 add.c
3458
3459   Instead of 1.1.1.3, I could have used one of the "Release Tags" last
3460   applied by "import" (3rd through Nth arguments).
3461   
3462   Suggestion: Practice on non-essential files.
3463   
3464   Last modified: _6/13/1997_
3465   
3466    4. What should I avoid when using "admin"? 
3467    
3468   If you know exactly what you are doing, hack away. But under normal
3469   circumstances:
3470   
3471   Never use "admin" to alter branches (using the '-b' option), which CVS
3472   takes very seriously. If you change the default branch, CVS will not
3473   work as expected. If you create new branches without using the "tag
3474   -b" command, you may not be able to treat them as CVS branches.
3475   
3476   See 3C.8 for a short discussion of how to use "admin -l" for
3477   serializing access to binary files.
3478   
3479   The "admin -o <file>" allows you to delete revisions, usually a bad
3480   idea. You should commit a correction rather than back out a revision.
3481   Outdating a revision is prone to all sorts of problems:
3482   
3483     Discarding data is always a bad idea. Unless something in the
3484   revision you just committed is a threat to your job or your life,
3485   (like naming a function "<boss's name>_is_a_dweeb", or including the
3486   combination to the local Mafioso's safe in a C comment), just leave it
3487   there. No one cares about simple mistakes -- just commit a corrected
3488   revision.
3489   
3490     The time travel paradoxes you can cause by changing history are not
3491   worth the trouble. Even if CVS can't interfere with your parents'
3492   introduction, it *can* log commits in at least two ways (history and
3493   loginfo). The reports now lie -- the revision referred to in the logs
3494   no longer exists.
3495   
3496     If you used "import" to place <file> into CVS, outdating all the
3497   revisions on the Main branch back to and including revision 1.2 (or
3498   worse, 1.1), will produce an invalid CVS file.
3499   
3500   If the <file>,v file only contains revision 1.1 (and the connected
3501   branch revision 1.1.1.1), then the default branch must be set to the
3502   Vendor branch as it was when you first imported the file. Outdating
3503   back through 1.2 doesn't restore the branch setting. Despite the above
3504   admonition against it, "admin -b" is the only way to recover:
3505   
3506                cvs admin -b1.1.1 <file>
3507
3508     Although you can't outdate a physical (RCS) branch point without
3509   removing the whole branch, you *can* outdate a revision referred to by
3510   a magic branch tag. If you do so, you will invalidate the branch.
3511   
3512     If you "outdate" a tagged revision, you will invalidate all uses of
3513   the <tag>, not just the one on <file>. A tag is supposed to be
3514   attached to a consistent set of files, usually a set built as a unit.
3515   By discarding one of the files in the set, you have destroyed the
3516   utility of the <tag>. And it leaves a dangling tag, which points to
3517   nothing.
3518   
3519     And even worse, if you commit a revision already tagged, you will
3520   alter what the <tag> pointed to without using the "tag" command. For
3521   example, if revision 1.3 has <tag> attached to it and you "outdate"
3522   the 1.3 revision, <tag> will point to a nonexistent revision. Although
3523   this is annoying, it is nowhere near as much trouble as the problem
3524   that will occur when you commit to this file again, recreating
3525   revision 1.3. The old tag will point to the new revision, a file that
3526   was not in existence when the <tag> was applied. And the discrepancy
3527   is nearly undetectable.
3528   
3529   If you don't understand the above, you should not use the admin
3530   command at all.
3531   
3532   Last modified: _6/13/1997_
3533   
3534    5. How do I restrict the "admin" command? The -i flag in the modules file
3535    can restrict commits. What's the equivalent for "admin"? 
3536    
3537   At this writing, to disable the "admin" command, you will have to
3538   change the program source code, recompile and reinstall.
3539   
3540   Last modified: _6/13/1997_
3541   
3542    6. I backed out a revision with "admin -o" and committed a replacement. Why
3543    doesn't "update" retrieve the new revision? 
3544    
3545   CVS is confused because the revision in the ./CVS/Entries file matches
3546   the latest revision in the Repository *and* the timestamp in the
3547   ./CVS/Entries file matches your working file. CVS believes that your
3548   file is "up-to-date" and doesn't need to be updated.
3549   
3550   You can cause CVS to notice the change by "touch"ing the file.
3551   Unfortunately what CVS will tell you is that you have a "Modified"
3552   file. If you then "commit" the file, you will bypass the normal CVS
3553   check for "up-to-date" and will probably commit the revision that was
3554   originally removed by "admin -o".
3555   
3556   Changing a file without changing the revision number confuses CVS no
3557   matter whether you did it by replacing the revision (using "admin -o"
3558   and "commit" or raw RCS commands) or by applying an editor directly to
3559   a Repository (",v") file. Don't do it unless you are absolutely
3560   certain no one has the latest revision of the file checked out.
3561   
3562   The best solution to this is to institute a program of deterrent
3563   flogging of abusers of "admin -o".
3564   
3565   The "admin" command has other problems." See 3B.4 above.
3566   
3567   Last modified: _6/13/1997_
3568   
3569  Category: /Commands_/checkout_co_get/
3570  
3571   " + "checkout", "co", "get""
3572   
3573    1. What is "checkout" for? 
3574    
3575   To acquire a copy of a module (or set of files) to work on.
3576   
3577   All work on files controlled by CVS starts with a "checkout".
3578   
3579   Last modified: _6/13/1997_
3580   
3581    2. What is the "module" that "checkout" takes on the command line? 
3582    
3583   It is a name for a directory or a collection of files in the
3584   Repository. It provides a compact name space and the ability to
3585   execute before and after helper functions based on definitions in the
3586   modules file.
3587   
3588   See 1D.11.
3589   
3590   Last modified: _6/13/1997_
3591   
3592    3. Isn't a CVS "checkout" just a bunch of RCS checkouts? 
3593    
3594   Like much of CVS, a similar RCS concept is used to support a CVS
3595   function. But a CVS checkout is *not* the same as an RCS checkout.
3596   
3597   Differences include:
3598   
3599     CVS does not lock the files. Others may access them at the same
3600   time.
3601   
3602     CVS works best when you provide a name for a collection of files (a
3603   module or a directory) rather than an explicit list of files to work
3604   on.
3605   
3606     CVS remembers what revisions you checked out and what branch you are
3607   on, simplifying later commands.
3608   
3609   Last modified: _6/13/1997_
3610   
3611    4. What's the difference between "update" and "checkout"? 
3612    
3613   The "checkout" and "update" commands are nearly equivalent in how they
3614   treat individual files. They differ in the following ways:
3615   
3616     The "checkout" command always creates a directory, moves into it,
3617   then becomes equivalent to "update -d".
3618   
3619     The "update" command does not create directories unless you add the
3620   '-d' option.
3621   
3622     "Update" is intended to be executed within a working directory
3623   created by "checkout". It doesn't take a module or directory argument,
3624   but figures out what Repository files to look at by reading the files
3625   in the ./CVS administrative directory.
3626   
3627     The two commands generate completely different types of records in
3628   the "history" file.
3629   
3630   Last modified: _6/13/1997_
3631   
3632    5. Why can't I check out a file from within my working directory? 
3633    
3634   Though you *can* check out a file, you normally check out a module or
3635   directory. And you normally do it only once at the beginning of a
3636   project.
3637   
3638   After the initial "checkout", you can use the "update" command to
3639   retrieve any file you want within the checked-out directory. There is
3640   no need for further "checkout" commands.
3641   
3642   If you want to retrieve another module or directory to work on, you
3643   must provide two pathnames: where to find it in the Repository and
3644   where to put it on disk. The "modules" file and your current directory
3645   supply two pieces of naming information. While inside a checked-out
3646   working directory, the CVS administrative information provides most of
3647   the rest.
3648   
3649   You should be careful not to confuse CVS with RCS and use "checkout"
3650   in the RCS sense. An RCS "checkout" (which is performed by the RCS
3651   "co" command) is closer to a "cvs update" than to a "cvs checkout".
3652   
3653   Last modified: _6/13/1997_
3654   
3655    6. How do I avoid dealing with those long relative pathnames? 
3656    
3657   This question has also been phrased:
3658   
3659   How do I avoid all those layers of directories on checkout? or Why do
3660   I have to go to the top of my working directory and checkout some long
3661   pathname to get a file or two?
3662   
3663   This type of question occurs only among groups of people who decide
3664   not to use "modules". The answer is to use "modules".
3665   
3666   When you hand the "checkout" command a relative pathname rather than a
3667   module name, all directories in the path are created, maintaining the
3668   same directory hierarchy as in the Repository. The same kind of
3669   environment results if you specify a "module" that is really an alias
3670   expanding into a list of relative pathnames rather than a list of
3671   module names.
3672   
3673   If you use "module" names, "checkout" creates a single directory by
3674   the name of the module in your current directory. This "module"
3675   directory becomes your working directory.
3676   
3677   The "module" concept combines the ability to "name" a collection of
3678   files with the ability to structure the Repository so that consistent
3679   sets of files are checked out together. It is the responsibility of
3680   the Repository Administrators to set up a modules file that describes
3681   the software within the Repository.
3682   
3683   Last modified: _6/13/1997_
3684   
3685    7. Can I move a checked-out directory? Does CVS remember where it was
3686    checked out? 
3687    
3688   Yes and Yes.
3689   
3690   The ./CVS/Repository file in each working directory contains a
3691   pathname pointing to the matching directory within the Repository. The
3692   pathname is either absolute or relative to $CVSROOT, depending on how
3693   you configured CVS.
3694   
3695   When you move a checked-out directory, the CVS administrative files
3696   will move along with it. As long as you don't move the Repository
3697   itself, or alter your $CVSROOT variable, the moved directory will
3698   continue to be usable.
3699   
3700   CVS remembers where you checked out the directory in the "history"
3701   file, which can be edited, or even ignored if you don't use the
3702   "working directory" information displayed by the "history" command.
3703   
3704   Last modified: _6/13/1997_
3705   
3706    8. How can I lock files while I'm working on them the way RCS does? 
3707    
3708   Until the day arrives of the all-powerful merge tool, there are still
3709   files that must be accessed serially. For those instances, here's a
3710   potential solution:
3711   
3712     Install a pre-commit program in the "commitinfo" file to check for
3713   RCS locks. The program "rcslock.pl" performs this function. It can be
3714   found in the contrib directory of the CVS source distribution.
3715   
3716     When you want to make a change to a file you know can't be merged,
3717   first use "cvs admin -l" to lock the file. If you can't acquire the
3718   lock, use the standard "locked out" protocol: go talk to the person
3719   holding the lock.
3720   
3721     Make sure the pre-commit program prints a message and exits with a
3722   non-zero status if someone besides the user running "commit" has the
3723   file locked. This non-zero exist status will cause the "commit" to
3724   fail cleanly.
3725   
3726     Make sure the pre-commit program exits with a zero status if the
3727   file is either unlocked or locked by the user running "commit". The
3728   "cvs commit" command that kicked off the pre-commit program will take
3729   a zero exist status as an OK and checkin the file, which has the
3730   side-effect of unlocking it.
3731   
3732   ===> The following is opinion and context. Don't read it if you are
3733   looking for a quick fix.
3734   
3735   The topic of locking CVS files resurfaces on the network every so
3736   often, producing the same results each time:
3737   
3738   The Big Endians:
3739   
3740   CVS was designed to avoid locks, using a copy-modify-merge model.
3741   Locking is not necessary and you should take the time to learn the CVS
3742   model which many people find workable. So why not get with the program
3743   and learn how to think the CVS way?
3744   
3745   The Little Endians:
3746   
3747   The users determine how a tool is to be used, not the designers. We,
3748   the users, have always used locking, our bosses demand locking,
3749   locking is good, locking is God. I don't want to hear any more
3750   lectures on the CVS model. Make locking work.
3751   
3752   Any organization making active changes to a source base will
3753   eventually face the need to do parallel development. Parallel
3754   development implies merges. (If you plan to keep separate copies of
3755   everything and never merge, good luck. Tell me who you work for so I
3756   can buy stock in your disk suppliers this year and sell your stock
3757   short next year.)
3758   
3759   Merges will never go away. CVS chose to make "merges" stand front and
3760   center as an important, common occurrence in development. It is one
3761   way of looking at things.
3762   
3763   For free-format text, the merge paradigm gives you a considerable
3764   amount of freedom. It does take a bit of management, but any project
3765   should be ready to deal with it.
3766   
3767   On the other hand, there are many files that can't be merged using
3768   text merge techniques. Straight text merge programs like "diff3" are
3769   guaranteed to fail on executables (with relative branch statements),
3770   files with self-referential counts stored in the file (such as TAGS
3771   files), or files with relative motion statements in them (such as
3772   Frame MIF files, many postscript files). They aren't all binary files.
3773   
3774   For these types of files, and many others, there are only two
3775   solutions:
3776   
3777     Complex merge tools that are intimately aware of the contents of the
3778   files to be merged. (ClearCase, and probably others, allow you to
3779   define your own "files types" with associated "merge tools".)
3780   
3781     Serialization of access to the file. The only technical solution to
3782   the problem of serialization is "locking".
3783   
3784   Since you can call a program that offers:
3785   
3786   "Which one do you want? A/B?"
3787   
3788   a "merge tool", more and more merge tools will appear which can be
3789   hooked into a merge-intensive program like CVS. Think of a bitmap
3790   "merge" tool that displays the bitmaps on the screen and offers a
3791   "paint" interface to allow you to cut and paste, overlay, invert or
3792   fuse the two images such that the result is a "merged" file.
3793   
3794   My conclusion is that the need for locking is temporary, awaiting
3795   better technology. For large development groups, locking is not an
3796   alternative to merging for text files.
3797   
3798   Last modified: _6/13/1997_
3799   
3800    9. What is "checkout -s"? How is it different from "checkout -c"? 
3801    
3802   The '-c' and '-s' options to "checkout" both cause the modules file to
3803   appear on standard output, but formatted differently.
3804   
3805   "checkout -c" lists the modules file alphabetized by the module name.
3806   It also prints all data (including options like '-a' and "-o <prog>")
3807   specified in the modules file.
3808   
3809   "checkout -s" lists the modules file sorted by "status" field, then by
3810   module name. The status field was intended to allow you to mark
3811   modules with strings of your choice to get a quick sorted report based
3812   on the data you chose to put in the status fields. I have used it for
3813   priority ("Showstopper", etc as tied into a bug database), for porting
3814   status ("Ported", "Compiled", etc. when porting a large collection of
3815   modules), for "assignee" (the person responsible for maintenance), and
3816   for "test suite" (which automatic test procedure to run for a
3817   particular module).
3818   
3819   Last modified: _6/13/1997_
3820   
3821  Category: /Commands_/commit_ci_com/
3822  
3823   " + "commit", "ci", "com""
3824   
3825    1. What is "commit" for? 
3826    
3827   To store new revisions in the Repository, making them visible to other
3828   users.
3829   
3830   Last modified: _6/13/1997_
3831   
3832    2. If I edit ten files, do I have to type "commit" ten times? 
3833    
3834   No. The "commit" command will take multiple filenames, directory names
3835   and relative pathnames on the command line and commit them all with
3836   the same log message. If a file is unchanged, even if it is explicitly
3837   listed on the command line, CVS will skip it.
3838   
3839   Like all CVS commands, "commit" will work on the whole directory by
3840   default. Just type "cvs commit" to tell CVS to commit all modified
3841   files (i.e. the files that "update" would display preceded by 'M') in
3842   the current directory and in all sub-directories.
3843   
3844   Last modified: _6/13/1997_
3845   
3846    3. Explain: cvs commit: Up-to-date check failed for `<file>' 
3847    
3848   You may not "commit" a file if your BASE revision (i.e. the revision
3849   you last checked out, committed or retrieved via "update") doesn't
3850   match the HEAD revision (i.e the latest revision on your branch,
3851   usually the Main Branch).
3852   
3853   In other words, someone committed a revision since you last executed
3854   "checkout", "update" or "commit". You must now execute "update" to
3855   merge the other person's changes into your working file before
3856   "commit" will work. You are thus protected (somewhat) from a common
3857   form of race condition in source control systems, where a checkin of a
3858   minor alteration of a second copy of the same base file obliterates
3859   the changes made in the first.
3860   
3861   Normally, the "update" command's auto-merge should be followed by
3862   another round of building and testing before the "commit".
3863   
3864   Last modified: _6/13/1997_
3865   
3866    4. What happens if two people try to "commit" conflicting changes? 
3867    
3868   Conflicts can occur only when two developers check out the same
3869   revision of the same file and make changes. The first developer to
3870   commit the file has no chance of seeing the conflict. Only the second
3871   developer runs into it, usually when faced with the "Up-to-date" error
3872   explained in the previous question.
3873   
3874   There are two types of conflicts:
3875   
3876     When two developers make changes to the same section of code, the
3877   auto-merge caused by "update" will print a 'C' on your terminal and
3878   leave "overlap" markers in the file.
3879   
3880   You are expected to examine and clean them up before committing the
3881   file. (That may be obvious to *some* of you, but . . .)
3882   
3883     A more difficult problem arises when two developers change different
3884   sections of code, but make calls to, or somehow depend on, the old
3885   version of each other's code.
3886   
3887   The auto-merge does the "right" thing, if you view the file as a
3888   series of text lines. But as a program, the two developers have
3889   created a problem for themselves.
3890   
3891   This is no different from making cross-referential changes in
3892   *separate* files. CVS can't help you. In a perfect world, you would
3893   each refer to the specification and resolve it independently. In the
3894   real world you have to talk/argue, read code, test and debug until the
3895   combined changes work again.
3896   
3897   Welcome to the world of parallel development.
3898   
3899   Last modified: _6/13/1997_
3900   
3901    5. I committed something and I don't like it. How do I remove it? 
3902    
3903   Though you *can* use the "admin -o" (synonym: "rcs -o") command to
3904   delete revisions, unless the file you committed is so embarrassing
3905   that the need to eradicate it overrides the need to be careful, you
3906   should just grab an old version of the file ("update -p -r
3907   <previous-rev>" might help here) and commit it on top of the offending
3908   revision.
3909   
3910   See Section 3B on "admin".
3911   
3912   Last modified: _6/13/1997_
3913   
3914    6. Explain: cvs commit: sticky tag `V3' for file `X' is not a branch 
3915    
3916   The message implies two things:
3917   
3918     You created your working directory by using "checkout -r V3", or you
3919   recently executed "update -r V3".
3920   
3921     The tag named V3 is not a branch tag.
3922   
3923   CVS records (i.e. makes "sticky") any "-r <tag/rev>" argument handed
3924   to the "checkout" or "update" commands. The <tag/rev> is recorded as
3925   the CVS working branch, which is the branch to which "commit" will add
3926   a new revision.
3927   
3928   Branch tags are created when you use the -b switch on the "tag" or
3929   "rtag" commands. Branch tags are magic tags that don't create a
3930   physical branch, but merely mark the revision to branch from when the
3931   branch is needed. The first commit to a magic branch creates a
3932   physical branch in the RCS files.
3933   
3934   You can commit onto the end of the Main Trunk, if you have no sticky
3935   tag at all, or onto the end of a branch, if you have a sticky branch
3936   tag. But you can't commit a file that has a sticky tag not pointing to
3937   a branch. CVS assumes a sticky Tag or Revision that does not refer to
3938   a branch is attached to the middle of a series of revisions. You can't
3939   squeeze a new revision between two others. Sticky dates also block
3940   commits since they never refer to a branch.
3941   
3942   Scenario1:
3943   
3944   If you don't want a branch and were just looking at an old revision,
3945   then you can move back to the Main Branch by typing:
3946   
3947                cvs update -A {files or dirs, default is '.'}
3948
3949   or you can move to the branch named <branch_tag> by:
3950   
3951                cvs update -r <branch_tag> {files or dirs, default is '.'}
3952
3953   Scenario2:
3954   
3955   If you really wanted to be on a branch and made an earlier mistake by
3956   tagging your branch point with a non-branch tag, you can recover by
3957   adding a new branch tag to the old non-branch tag:
3958   
3959                    cvs rtag -b -r <oldtag> <newtag> <module>
3960
3961   (It was not a big mistake. Branch-point tags can be useful. But the
3962   <newtag> must have a different name.)
3963   
3964   If you don't know the <module> name or don't use "modules", you can
3965   also use "tag" this way:
3966   
3967                    cvs update -r <oldtag>
3968                    cvs tag -b <newtag> .
3969
3970   Then, to put your working directory onto the branch, you type:
3971   
3972                    cvs update -r <newtag>
3973
3974   You can't delete <oldtag> before adding <newtag>, and I would not
3975   advise deleting the <oldtag> at all, because it is useful in referring
3976   to the branch point. If you must, you can delete the non-branch tag
3977   by:
3978   
3979                    cvs rtag -d <oldtag> <module>
3980                or
3981                    cvs tag -d <oldtag> .
3982
3983   Scenario3:
3984   
3985   If you made the same mistake as in Scenario2 (of placing a non-branch
3986   tag where you wanted a branch tag), but really want <oldtag> to be the
3987   name of your branch, you can execute a slightly different series of
3988   commands to rename it and move your working directory onto the branch.
3989   
3990   Warning: This is not a way to rename a branch tag. It is a way to turn
3991   a non-branch tag into a branch tag with the same name.
3992   
3993                    cvs rtag -r <oldtag> <branch_point_tag> <module>
3994                    cvs rtag -d <oldtag> <module>
3995                    cvs rtag -b -r <branch_point_tag> <oldtag> <module>
3996
3997   Then, if you really must, delete the <branch_point_tag>:
3998   
3999                    cvs rtag -d <branch_point_tag> <module>
4000
4001   Note: The unwieldy mixture of "tag" and "rtag" is mostly because you
4002   can't specify a revision (-r <tag>) to the "tag" command.
4003   
4004   See 4C.3 for more info on creating a branch.
4005   
4006   Last modified: _6/13/1997_
4007   
4008    7. Why does "commit -r <tag/rev>" put newly added files in the Attic? 
4009    
4010   If you specify "-r <rev>" (where <rev> is a dotted numeric number like
4011   2.4), it correctly sets the initial revision to <rev>, but it also
4012   attaches the numeric <rev> as a sticky tag and throws the file into
4013   the Attic. This is a bug. The obvious solution is to move the file out
4014   of the Attic into the associated Repository directory and "update -A"
4015   the file. There are no Tags to clean up.
4016   
4017   If you specify "-r <tag>" to commit a newly added file, the <tag> is
4018   treated like a <branch_tag>, which becomes a symbolic RCS label
4019   pointing to the string '1', which can be considered to be the "Main
4020   branch number" when the main branch is still at revision 1.N. The file
4021   is also thrown into the Attic. See 4C.8 for a way to recover from
4022   this.
4023   
4024   In fact, a plain "commit" without the "-r" will throw a newly added
4025   file into the Attic if you added it to a directory checked out on a
4026   branch. See 3A.[2-5].
4027   
4028   See Section 4C, on Branching, for many more details.
4029   
4030   Last modified: _6/13/1997_
4031   
4032    8. Why would a "commit" of a newly added file not produce rev 1.1? 
4033    
4034   When committing a newly added file CVS looks for the highest main
4035   branch major number in all files in the ./CVS/Entries file. Normally
4036   it is '1', but if you have a file of revision 3.27 in your directory,
4037   CVS will find the '3' and create revision 3.1 for the first rev of
4038   <file>. Normally, the first revision is 1.1.
4039   
4040   Last modified: _6/13/1997_
4041   
4042  Category: /Commands_/diff_di_dif/
4043  
4044   " + "diff", "di", "dif""
4045   
4046    1. What is "diff" for? 
4047    
4048     To display the difference between a working file and its BASE
4049   revision (the revision last checked out, updated or committed):
4050   
4051                cvs diff <file>
4052
4053     To display the difference between a working file and a committed
4054   revision of the same file:
4055   
4056                cvs diff -r <tag/rev> <file>
4057
4058     To display the difference between two committed revisions of the
4059   same file:
4060   
4061                cvs diff -r <tag1/rev1> -r <tag2/rev2> <file>
4062
4063   You can specify any number of <file> arguments. Without any <file>
4064   arguments, it compares the whole directory.
4065   
4066   In the examples above, "-D <date>" may be substituted wherever "-r
4067   <tag/rev>" appears. The revision a <date> refers to is the revision
4068   that existed on that date.
4069   
4070   Last modified: _6/13/1997_
4071   
4072    2. Why did "diff" display nothing when I know there are later committed
4073    revisions in the Repository? 
4074    
4075   By default, "diff" displays the difference between your working file
4076   and the BASE revision. If you haven't made any changes to the file
4077   since your last "checkout", "update" or "commit" there is no
4078   difference to display.
4079   
4080   To display the difference between your working file and the latest
4081   revision committed to your current branch, type:
4082   
4083                cvs diff -r HEAD <file>
4084
4085   Last modified: _6/13/1997_
4086   
4087    3. How do I display what changed in the Repository since I last executed
4088    "checkout", "update" or "commit"? 
4089    
4090   A special tag (interpreted by CVS -- it does not appear in the Tag
4091   list) named "BASE" always refers to the revision you last checked out,
4092   updated or committed. Another special tag named "HEAD" always refers
4093   to the latest revision on your working branch.
4094   
4095   To compare BASE and HEAD, you type:
4096   
4097                cvs diff -r BASE -r HEAD <file>
4098
4099   Last modified: _6/13/1997_
4100   
4101    4. How do I display the difference between my working file and what I
4102    checked in last Thursday? 
4103    
4104                cvs diff -D "last Thursday" <file>
4105
4106   where "last Thursday" is a date string. To be more precise, the
4107   argument to the '-D' option is a timestamp. Many formats are accepted.
4108   See the man page under "-D date_spec" for details.
4109   
4110   Last modified: _6/13/1997_
4111   
4112    5. Why can't I pass long options, like --unified, to "diff"? 
4113    
4114   CVS only handles single character '-X' arguments, not the FSF long
4115   options. CVS also passes through only arguments it knows about,
4116   because a few arguments are captured and interpreted by CVS.
4117   
4118   If you didn't configure RCS and CVS to use the GNU version of diff,
4119   long options wouldn't work even if future versions of CVS acquire the
4120   ability to pass them through.
4121   
4122   Most of the long options have equivalent single-character options,
4123   which do work. The "--unified" option is equivalent to '-u' in
4124   revisions of GNU diff since 1.15.
4125   
4126   Last modified: _6/13/1997_
4127   
4128  Category: /Commands_/export_exp_ex/
4129  
4130   " + "export", "exp", "ex""
4131   
4132    1. What is "export" for? 
4133    
4134   "export" checks out a copy of a module in a form intended for export
4135   outside the CVS environment. The "export" command produces the same
4136   directory and file structure as the "checkout" command, but it doesn't
4137   create "CVS" sub-directories and it removes all the RCS keywords from
4138   the files.
4139   
4140   Last modified: _6/13/1997_
4141   
4142    2. Why does it remove the RCS keywords so I can't use the "ident" command
4143    on the source files? 
4144    
4145   It removes the RCS keywords, so that if the recipient of the exported
4146   sources checks them into another set of RCS files (with or without
4147   CVS), and then makes modifications through RCS or CVS commands, the
4148   revision numbers that they had when you exported them will be
4149   preserved. (That ident no longer works is just an unfortunate side
4150   effect.)
4151   
4152   The theory is that you are exporting the sources to someone else who
4153   will make independent changes, and at some point you or they will want
4154   to know what revisions from your Repository they started with
4155   (probably to merge changes, or to try to decide whether to merge
4156   changes).
4157   
4158   A better way to handle this situation would be to give them their own
4159   branch of your Repository. They would need to remember to checkin the
4160   exported sources with RCS IDs intact (ci -k) so that their changes
4161   would get revision numbers from the branch, rather than starting at
4162   1.1 again. Perhaps a future version of CVS will provide a way to
4163   export sources this way.
4164   
4165                                Contributed by Dan Franklin
4166
4167   Last modified: _6/13/1997_
4168   
4169    3. Can I override the '-kv' flag CVS passes to RCS? 
4170    
4171   Not as of CVS version 1.4.
4172   
4173   Last modified: _6/13/1997_
4174   
4175    4. Why doesn't "export" have a '-k' flag like "import" does? 
4176    
4177   Export is intended for a specific purpose -- to remove all trace of
4178   revision control on the way *out* of CVS.
4179   
4180   Last modified: _6/13/1997_
4181   
4182    5. Why does "export -D" check out every file in the Attic? 
4183    
4184   See 5B.3 for an explanation of the same problem with "update".
4185   
4186   Last modified: _6/13/1997_
4187   
4188  Category: /Commands_/history_hi_his/
4189  
4190   " + "history", "hi", "his""
4191   
4192    1. What is "history" for? 
4193    
4194   To provide information difficult or impossible to extract out of the
4195   RCS files, such as a "tag" history or a summary of module activities.
4196   
4197   Last modified: _6/13/1997_
4198   
4199    2. Of what use is it? 
4200    
4201   I have found it useful in a number of ways, including:
4202   
4203     Providing a list of files changed since
4204   
4205   - A tagged release.
4206   - Yesterday, last Thursday, or a specific date.
4207   - Someone changed a specific file.
4208   
4209     Providing a list of special events:
4210   
4211   - Files added or removed since one of the above events.
4212   - Merge failures since one of the above events. (Where did the
4213   conflicts occur?)
4214   - Has anyone (and who) grabbed the revision of this file I committed
4215   last week, or are they still working blind?
4216   
4217     Telling me how often a file/directory/module has been changed.
4218   
4219     Dumping a summary of work done on a particular module, including who
4220   last worked on it and what changed.
4221   
4222     Displaying the checked-out modules and where they are being worked
4223   on.
4224   
4225     To tell me what users "joe" and "malcolm" have done this week.
4226   
4227   Last modified: _6/13/1997_
4228   
4229    3. What is this, Big Brother? 
4230    
4231                War is Peace.
4232                Freedom is Slavery.
4233                Ignorance is Strength.
4234
4235   Normally manager types and those with the power to play Big Brother
4236   don't care about this information. The Software Engineer responsible
4237   for integration usually wants to know who is working on what and what
4238   changed. Use your imagination.
4239   
4240   Last modified: _6/13/1997_
4241   
4242    4. I deleted my working directory and "history" still says I have it
4243    checked out. How do I fix it? 
4244    
4245   You can use "release -f" to forcibly add a "release" record to the
4246   history file for a working directory associated with a "module". If
4247   your version of "release" doesn't have the '-f' option, or you checked
4248   out the directory using a relative path, you have to edit the
4249   $CVSROOT/CVSROOT/history file.
4250   
4251   You can remove the last 'O' line in the history file referring to the
4252   module in question or add an 'F' record.
4253   
4254   Last modified: _6/13/1997_
4255   
4256    5. So I *can* edit the History file? 
4257    
4258   Yes, but if you are using history at all, you should take a little
4259   care not to lose information. I normally use Emacs on the file, since
4260   it can detect that a file has changed out from under it. You could
4261   also copy and zero out the history file, edit the copy and append any
4262   new records to the edited copy before replacing it.
4263   
4264   Last modified: _6/13/1997_
4265   
4266    6. Why does the history file grow so quickly? 
4267    
4268   It stores 'U' records, which come in handy sometimes when you are
4269   tracking whether people have updated each other's code before testing.
4270   There should (and probably will sometime) be a way to choose what
4271   kinds of events go into the history file.
4272   
4273   The contributed "cln_hist.pl" script will remove all the 'U' records,
4274   plus matching pairs of 'O' and 'F' records during your normal clean up
4275   of the history file.
4276   
4277   Last modified: _6/13/1997_
4278   
4279    7. What is the difference between "cvs history -r <tag/rev>" and "cvs
4280    history -t <tag>"? 
4281    
4282   The '-t' option looks for a Tag record stored by "rtag" in the history
4283   file and limits the search to dates after the last <tag> of the given
4284   name was added.
4285   
4286   The '-r' option was intended to search all files looking for the <tag>
4287   in the RCS files. It takes forever and needs to be rewritten.
4288   
4289   Last modified: _6/13/1997_
4290   
4291    8. Why does "cvs history -c -t <tag>" fail to print anything? 
4292    
4293   You have been using "tag" instead of "rtag". The "tag" command
4294   currently doesn't store a history record. This is another remnant of
4295   CVS's earlier firm belief in "modules". But it also has a basis in how
4296   "rtag" and "tag" were originally used.
4297   
4298   "rtag" was intended for large-scale tagging of large chunks of the
4299   Repository, an event work recording. "tag" was intended for adding and
4300   updating tags on a few files or directories, though it could also be
4301   used to tag the entire checked-out working tree when there is no
4302   module defined to match the tree or when the working tree is the only
4303   place where the right collection of revisions to tag can be found.
4304   
4305   Last modified: _6/13/1997_
4306   
4307    9. "cvs history -a -o" only printed one line for each checked-out module.
4308    Shouldn't it print all the directories where the modules are checked out? 
4309    
4310   Not as designed.
4311   
4312        Command                 Question it is supposed to answer.
4313        ----------------        ------------------------------------------
4314        cvs history -o          What modules do I have checked out?
4315        cvs history -a -o       <same for all users>
4316
4317        cvs history -o -w       What working directories have I created
4318                                and what modules are in them?
4319        cvs history -a -o -w    <same for every user>
4320
4321   The -o option chooses the "checked out modules" report, which is the
4322   default history report.
4323   
4324   Last modified: _6/13/1997_
4325   
4326    10. I can't figure out "history", can you give me concrete examples? 
4327    
4328   Default output selects records only for the user who executes the
4329   "history" command. To see records for other users, add one or more "-u
4330   user" options or the '-a' option to select *all* users.
4331   
4332   To list (for the selected users): Type "cvs history" and:
4333   
4334   * Checked out modules: -o (the default)
4335   * Files added since creation: -x A
4336   * Modified files since creation: -c
4337   * Modified files since last Friday: -c -D 'last Friday'
4338   * Modified files since TAG was added: -c -t <tag>
4339   * Modified files since TAG on files: -c -r <tag>
4340   * Last modifier of file/Repository X? -c -l -[fp] X
4341   * Modified files since string "str": -c -b str
4342   * Tag history: (Actually "rtag".) -T
4343   * History of file/Repository/module X: -[fpn] X
4344   * Module report on "module": -m module
4345   
4346   Last modified: _6/13/1997_
4347   
4348    11. Can we merge history files when we merge Repositories? 
4349    
4350   Assuming that the two Repositories have different sets of pathnames,
4351   it should be possible to merge two history files by sorting them
4352   together by the timestamp fields.
4353   
4354   You should be able to run:
4355   
4356   sort +0.1 ${dir1}/history ${dir2}/history > history
4357   
4358   If you "diff" a standard history file before and after such a sort,
4359   you might see other differences caused by garbage (split lines, nulls,
4360   etc) in the file. If your Repository is mounted through NFS onto
4361   multiple machines you will also see a few differences caused by
4362   different clocks on different machines. (Especially if you don't use
4363   NTP to keep the clocks in sync.)
4364   
4365   Last modified: _6/13/1997_
4366   
4367  Category: /Commands_/import_im_imp/
4368  
4369   " + "import", "im", "imp""
4370   
4371    1. What is "import" for? 
4372    
4373   The "import" command is a fast way to insert a whole tree of files
4374   into CVS.
4375   
4376   The first "import" to a particular file within the Repository creates
4377   an RCS file with a single revision on the "Vendor branch." Subsequent
4378   "import"s of the same file within the Repository append a new revision
4379   onto the Vendor branch. It does not, as some seem to believe, create a
4380   new branch for each "import". All "imports" are appended to the single
4381   Vendor branch.
4382   
4383   If the file hasn't changed, no new revision is created -- the new
4384   "Release-Tag" is added to the previous revision.
4385   
4386   After the import is finished, files you have not changed locally are
4387   considered to have changed in the "Main line of development". Files
4388   you *have* changed locally must have the new Vendor code merged into
4389   them before they are visible on the "Main line".
4390   
4391                See 4C.6 and 4C.15
4392
4393   Last modified: _6/13/1997_
4394   
4395    2. How am I supposed to use "import"? 
4396    
4397   Create a source directory containing only the files you want to
4398   import. Make sure you clean up any cruft left over from previous
4399   builds or editing. You want to make sure that the directory contains
4400   only what you want to call "source" from which everything else is
4401   built.
4402   
4403   If this is not the first import from this "Vendor", you should also
4404   compare the output of "find . ! -name CVS -print | sort" executed both
4405   at the head of a checked out working directory and at the head of the
4406   sources to be imported. If you find any deleted or renamed files, you
4407   have to deal with them by hand. (See 4B.8 on renaming.)
4408   
4409   "cd" into your source directory and type:
4410   
4411            cvs import -m "Message" <repos> <Vendor-Tag> <Release-Tag>
4412
4413   where <repos> is the relative directory pathname within the Repository
4414   that corresponds to the sources you are importing.
4415   
4416   You might also consider using the "-I !" option to avoid ignoring
4417   anything. It is easier to remove bogus files from the Repository than
4418   to create a sparse tree of the ignored files and rerun "import".
4419   
4420   For example, if the FSF, CVS, Make and I are still active in the year
4421   2015, I'll import version 89.53 of GNU make this way:
4422   
4423            cvs import -m "GNUmake V89.53" gnu/make GNU GNUMAKE_89_53
4424
4425   See 3H.13 for more details.
4426   
4427   Last modified: _6/13/1997_
4428   
4429    3. Why does import put files on a branch? Why can't I work on the main
4430    trunk instead of a Vendor branch? 
4431    
4432   This was a Design choice. The Vendor branch is the way "import" deals
4433   with a Vendor release. It is a solution to the Engineering problem of
4434   how to merge multiple external releases of Vendor-supplied sources
4435   into your ongoing work. The Vendor releases are kept on a separate,
4436   special, "Vendor" branch and your work is kept on the RCS trunk. New
4437   Vendor releases are imported onto the Vendor branch and then merged
4438   into your work, if there is any, on the trunk.
4439   
4440   This way, you can use CVS to find out not only about your work, but
4441   you can also find out what the Vendor changed by diffing between two
4442   of the Release Tags you handed to "import".
4443   
4444   CVS was designed to work this way. If you use CVS in some other way,
4445   you should think carefully about what you are doing.
4446   
4447   Note that the CVS "Main Branch" and the RCS Main Trunk are not the
4448   same. Placing files on the Vendor Branch doesn't keep you from
4449   creating a development branch to work on.
4450   
4451   See Section 4C, on Branching.
4452   
4453   If you are not working with 3rd party (i.e. Vendor) sources, you can
4454   skip the "import" and avoid the Vendor branch entirely. It works just
4455   as well to move pre-existing RCS files into Repository directories.
4456   
4457   You can create a whole Repository tree by copying a directory
4458   hierarchy of normal source files directly into the Repository and
4459   applying CVS to it. Here's an idea you should *test* before using:
4460   
4461                cd <your source tree>
4462                set source = `pwd`
4463                set module = xyzzy      <<== Your choice of directory name
4464                mkdir $CVSROOT/$module
4465                cd $CVSROOT/$module
4466                (cd $source; tar cf - .) | tar xvpBf -
4467                find . -type f -exec ci -t-Original. {} \;
4468
4469   The RCS "ci" command, without -u or -l options, will turn your source
4470   file into an RCS (",v") and delete the original source.
4471   
4472   Last modified: _6/13/1997_
4473   
4474    4. Is there any way to import binary files? 
4475    
4476   If you configured CVS to use the GNU version of "diff" and "diff3",
4477   then you can import any kind of file.
4478   
4479   Binary files with RCS keywords in them are a problem, since you don't
4480   want them to expand.
4481   
4482   If the tree you are about to "import" is entirely filled with binary
4483   files, you can use the '-ko' option on "import". Otherwise, I would
4484   run the import normally, then fix the binary files as described below
4485   in 3H.5.
4486   
4487   See 4D.1 on Binary files.
4488   
4489   Last modified: _6/13/1997_
4490   
4491    5. Why does "import" corrupt some binary files? 
4492    
4493   The RCS "co" command, when it is invoked by a CVS "checkout" or
4494   "update" (or after a "commit") command, searches for and expands a
4495   list of keywords within the file. They are documented in the RCS "co"
4496   man page. Strings such as "$\Id$" (or "$\Id:"), or "$\Revision$" (or
4497   "$\Revision:") are altered to the include the indicated information.
4498   
4499   [[Note: The keywords should appear in the text without the '\'
4500   character I have inserted to *avoid* expansion here. The only real RCS
4501   keywords in this document are at the top of the file, where I store
4502   the Revision and Date.]]
4503   
4504   If RCS keyword strings show up in a binary file, they will be altered
4505   unless you set the '-ko' option on the RCS files to tell RCS to keep
4506   the original keyword values and not to expand new ones. After
4507   "import", you can set the '-ko' option this way:
4508   
4509                cvs admin -ko <file>
4510                rm <file>
4511                cvs update <file>
4512
4513   After an import that didn't use '-ko' (because the whole tree wasn't
4514   of binary files) you should fix up the binary files as described above
4515   before checking out any new copies of the files and before updating
4516   any working directories you checked out earlier.
4517   
4518   See 4D.1 on Binary files.
4519   
4520   Last modified: _6/13/1997_
4521   
4522    6. How do I retain the original $\Revision$ strings in the sources? 
4523    
4524   If you want to leave old RCS keywords as they are, you can use the
4525   '-ko' tricks described above.
4526   
4527   Last modified: _6/13/1997_
4528   
4529    7. I imported some files for the Yarg compiler that compiles files with a
4530    suffix of ".yarg" and whose comment prefix is "YARG> ". When I check them
4531    out, they will no longer compile because they have this junk in them. Why? 
4532    
4533        YARG>YARG>YARG>YARG>YARG>YARG>YARG>YARG>YARG>YARG>YARG>YARG>YARG>
4534        YARG> $\Log:
4535        # Revision 1.3  1998/03/03  00:16:16  bubba
4536        # What is 2+2 anyway?
4537        #
4538        # Revision 1.2  1998/03/03  00:15:15  bubba
4539        # Added scorekeeping.
4540        YARG>
4541        YARG>YARG>YARG>YARG>YARG>YARG>YARG>YARG>YARG>YARG>YARG>YARG>YARG>
4542
4543   Well bubba, "Yarg" hasn't hit the big time yet. Neither RCS nor CVS
4544   know about your suffix or your comment prefix. So you have two
4545   choices:
4546   
4547     Check out the Yarg-less module, and tell all the files about your
4548   comment prefix. Visit each directory and type:
4549   
4550                cvs admin -c"YARG> " *.yarg
4551
4552   If *all* files in the whole directory tree are Yarg files, you can use
4553   this instead:
4554   
4555                cvs admin -c"YARG> " .
4556
4557   Then save any changes you made, remove all the "*.yarg" files and grab
4558   new copies from the Repository:
4559   
4560   rm *.yarg (or: find . -name '*.yarg' -exec rm {} ';') (or: find .
4561   -name '*.yarg' -print | xargs rm) (or: find . -name '*.yarg' -print0 |
4562   xargs -0 rm if you have spaces in filenames and the GNU find/xargs.)
4563   cvs update
4564   
4565   It might be faster to remove the whole directory and check it out
4566   again.
4567   
4568     Change the import.c file in the CVS sources and add the .yarg
4569   suffix, along with the "YARG> " comment prefix to the "comtable"
4570   array.
4571   
4572   If you ever plan to add new files with $\Log in them, you should also
4573   go into the RCS sources and make the same change in the table
4574   contained in the "rcsfnms.c" file.
4575   
4576   Then delete the imported files from the Repository and re-"import" the
4577   sources.
4578   
4579   Last modified: _6/13/1997_
4580   
4581    8. How do I make "import" save the timestamps on the original files? 
4582    
4583   Use "import -d" to save the current timestamps on the files as the RCS
4584   revision times.
4585   
4586   See 4D.8 for another aspect of file timestamps.
4587   
4588   Last modified: _6/13/1997_
4589   
4590    9. Why can't I "import" 3 releases on different branches? 
4591    
4592   I'll bet you typed something like this:
4593   
4594                cd /src/blasto.v2
4595                cvs import -b 1.1.2  VENDOR2 Version2
4596                cd /src/blasto.v3
4597                cvs import -b 1.1.3  VENDOR3 Version3
4598                cd /src/blasto.v4
4599                cvs import -b 1.1.4  VENDOR4 Version4
4600
4601   This is wrong, or at least it won't help you much. You have created
4602   three separate Vendor branches, which is probably not what you wanted.
4603   
4604   Earlier versions of CVS, as described in Brian Berliner's Usenix
4605   paper, tried to support multiple Vendor branches on the theory that
4606   you might receive source for the *same* program from multiple vendors.
4607   It turns out that this is very rare, whereas the need to branch in
4608   *your* development, for releases and for project branches, is much
4609   greater.
4610   
4611   So the model now is to use a single vendor branch to contain a series
4612   of releases from the same vendor. Your work moves along on the Main
4613   Trunk, or on a CVS branch to support a real "branch in development".
4614   
4615   To set this up, you should type this instead of the above:
4616   
4617                cd /src/blasto.v2
4618                cvs import VENDOR Version2
4619                cd /src/blasto.v3
4620                cvs import VENDOR Version3
4621                cd /src/blasto.v4
4622                cvs import VENDOR Version4
4623
4624   Last modified: _6/13/1997_
4625   
4626    10. What do I do if the Vendor adds or deletes files between releases? 
4627    
4628   Added files show up with no extra effort. To handle "removed" files,
4629   you should always compare the tree structure of the new release
4630   against the one you have in your Repository. If the Vendor has removed
4631   files since the previous release, go into a working directory
4632   containing your current version of the sources and "cvs remove"
4633   (followed by "cvs commit" to make it really take effect) each file
4634   that is no longer in the latest release.
4635   
4636   Using this scheme will allow you to "checkout" any version of the
4637   vendor's code, with the correct revisions and files, by using
4638   "checkout -r Version[234]".
4639   
4640   Renames are harder to find, since you have to compare file contents to
4641   determine that one has occurred. If you notice one, see 4B.8 on
4642   renaming files.
4643   
4644   Last modified: _6/13/1997_
4645   
4646    11. What about if the Vendor changes the names of files or directories, or
4647    rearranges the whole structure between releases? 
4648    
4649   Currently CVS can't handle this cleanly. It requires "renaming" a
4650   bunch of files or directories.
4651   
4652   See 4B.8 on "renaming" for more details.
4653   
4654   What I generally do is to close the Repository for a while and make
4655   changes in both the Repository and in a copy of the vendor release
4656   until the structure matches, then execute the import.
4657   
4658   If you ever have to check out and build an old version, you may have
4659   to use the new, or completely different Makefiles.
4660   
4661   Last modified: _6/13/1997_
4662   
4663    12. I thought "import" was for Vendor releases, why would I use it for code
4664    of my own? Do I have to use import? 
4665    
4666   For code you produce yourself, "import" is a convenience for fast
4667   insertion of whole trees. It is not necessary. You can just as easily
4668   create ",v" files using the RCS "ci" command and move them directly
4669   into the Repository.
4670   
4671   Other than the CVSROOT directory, the Repository consists entirely of
4672   directories of ",v" files. The Repository contains no other state
4673   information.
4674   
4675   See Section 4B, on Setting up and Managing the Repository.
4676   
4677   Last modified: _6/13/1997_
4678   
4679    13. How do I import a large Vendor release? 
4680    
4681   When the sum of the changes made by the Vendor and the changes made by
4682   local developers is small, "import" is not a big problem. But when you
4683   are managing a large Repository, any care taken up front will save you
4684   time later.
4685   
4686   First read the following, then, before executing "import", see the
4687   questions in Section 4C dealing with branch merges and Vendor branch
4688   merges.
4689   
4690     If this is not the first import of this code, before starting, rtag
4691   the whole directory you will be changing.
4692   
4693     The first step is to make sure the structure of the new files
4694   matches the structure of the current Repository.
4695   
4696   Run "find . -print | sort" on both trees and "diff" the output.
4697   
4698     Alter the "source" tree until the "diff" (of the list of filenames,
4699   not of the whole trees) shows that the directory structures are
4700   equivalent.
4701   
4702   The "comm" command, if you have it, can help figure out what has been
4703   added or deleted between releases.
4704   
4705     If they deleted any files, you can handle them cleanly with "cvs
4706   remove". The command "comm -23 files.old files.new" will show you a
4707   list of files that need to be removed.
4708   
4709   You should examine the list first to see if any have been renamed
4710   rather than simply deleted.
4711   
4712     If they renamed any files, see 4B.8 on renaming files.
4713   
4714     Remember to *SAVE* the output from the import command.
4715   
4716     When you have dealt with removed and renamed files, then you can
4717   execute the import:
4718   
4719   cd <new source>
4720           cvs import -I ! -m "Message" <repos> <VendorTag> <ReleaseTag>
4721
4722   Where
4723   
4724   "-I !" is an optional argument that keeps "import" from ignoring
4725   files. The comparison of the "find" commands above will probably avoid
4726   the need for this, but it is easier to remove files from the
4727   Repository than to run a subset "import" to catch just the ignored
4728   files. [You might have to quote or backwhack the '!'.]
4729   
4730           Message      is the log message to be stored in the RCS files.
4731
4732           <repos>      is a relative path to a directory within the
4733                        Repository.  The directory <new source> must be at
4734                        the same relative level within the new sources as
4735                        the <repos> you give is within the Repository.  (I
4736                        realize this is not obvious.  Experiment first.)
4737
4738           <VendorTag>  is a Tag used to identify the Vendor who sent you
4739                        the files you are importing.  All "imports" into
4740                        the same <repos> *must* use the same VendorTag.
4741                        You can find it later by using the "log" command.
4742
4743   <ReleaseTag> is a Tag used to identify the particular release of the
4744   software you are importing. It must be unique and should be mnemonic
4745   -- at least include the revision number in it. (Note: you can't use
4746   '.' characters in a Tag. Substitute '_' or '-'.)
4747   
4748     There will be six categories of files to deal with. (Actually there
4749   are eight, but you have already dealt with "removed" and "renamed"
4750   files.)
4751   
4752   If this is the first "import" into a given <repos> directory, only the
4753   first three of these ('I', 'L' and 'N') can occur.
4754   
4755     Ignored file.
4756   
4757   CVS prints: I filename
4758   
4759   You'll need to examine it to see if it *should* have been ignored. If
4760   you use "-I !", nothing will be ignored.
4761   
4762     Symbolic link.
4763   
4764   CVS prints: L linkname
4765   
4766   Links are "ignored", but you'll probably want to create a "checkout
4767   helper" function to regenerate them.
4768   
4769     New file.
4770   
4771   CVS prints: N filename
4772   
4773   CVS creates a new file in the Repository. You don't have to do
4774   anything to the file, but you might have to change Makefiles to refer
4775   to it if this is really a new file.
4776   
4777     A file unchanged by the Vendor since its last release.
4778   
4779   CVS prints: U filename
4780   
4781   CVS will notice this and simply add the new ReleaseTag to the latest
4782   rev on the Vendor branch.
4783   
4784   No work will be needed by you, whether you have changed the file or
4785   not. No one will notice anything.
4786   
4787     A file changed by the Vendor, but not by you.
4788   
4789   CVS prints: U filename
4790   
4791   CVS should add the file onto the vendor branch and attach the Release
4792   Tag to it.
4793   
4794   When you next execute "update" in any working directory you'll get the
4795   new revision.
4796   
4797     A file changed by both the Vendor and by you.
4798   
4799   CVS prints: C filename
4800   
4801   These are the trouble files. For each of these files (or in groups --
4802   I usually do one directory at a time), you must execute:
4803   
4804                    cvs update -j <PreviousReleaseTag> -j <ReleaseTag>
4805                or
4806                    cvs update -j <VendorTag:yesterday> -j <VendorTag>
4807
4808   It will print either 'M' (if no overlaps) or 'C', if overlaps. If a
4809   'C' shows up, you'll need to edit the file by hand.
4810   
4811   Then, for every file, you'll need to execute "cvs commit".
4812   
4813   See the part of Section 4C dealing with branch merges.
4814   
4815     If you are truly performing a large import, you will most likely
4816   need help. Managing those people is another problem area.
4817   
4818   Since the merge of the Vendor branch is just like any other merge, you
4819   should read section 4C for more info about performing and cleaning up
4820   merges.
4821   
4822   The larger the import, and the larger the group of people involved,
4823   the more often you should use "tag" and "rtag" to record even trivial
4824   milestones. See 4C.14, especially the "paranoid" section.
4825   
4826   Before starting the import, you should install and test a "commitinfo"
4827   procedure to record all commits in a file or via Email to a mail
4828   archive. Along with the tags you placed on the Repository before the
4829   import, this archive will help to track what was changed, if problems
4830   occur
4831   
4832   There are four stages to the recovery:
4833   
4834     Parcel out the work -- Effective Emacs Engineering.
4835   
4836   As input to the assignment process, you might want to examine the tree
4837   and record the last person who changed the file. You can also
4838   research, if you don't already know, who is expert in each area of the
4839   software.
4840   
4841   Examine the import log (you saved the output, right?), estimate how
4842   much work is involved in each area and assign groups of files to
4843   individual developers. Unless some directory is immense, it is easier
4844   to manage if you assign whole directories to one person.
4845   
4846   Keep a list. Suggest a completion date/time. Tell them to "commit" the
4847   file when they are finished with the merge. If you tagged the
4848   Repository before starting the import, you should have no trouble
4849   figuring out what happened.
4850   
4851   If you can, find out (or tell them) which working directory to use.
4852   You should verify that the working directory they use is on the Main
4853   Branch ("update -A") and without modified files.
4854   
4855   If you trust your crew, have them notify you by Email. Have them send
4856   you the output from "cvs update" in their working directory. You might
4857   have to poll some people until you are certain they have finished, or
4858   have given up. (This is not an invention. I've heard a false, "Yeah,
4859   sure. I finished yesterday," more times that you'd believe.)
4860   
4861   When all reports are in, go on to the Source Verification stage.
4862   
4863     Source Verification -- CVS and other Tools.
4864   
4865   If you didn't dictate which ones to use, find all working directories
4866   and run "cvs -n update" in all of them. The history command and the
4867   "commitinfo" log you set up might help to find checked out working
4868   directories.
4869   
4870   Sticky conflict flags will help, but they can't recover from
4871   sloppiness or incompetence. You might want to check everything out
4872   into a tree and grep for the parts of the merge conflict markers CVS
4873   doesn't look for. CVS looks for the string '^>>>>>>> '. The merge
4874   operation also puts '^<<<<<<< ' and '^======= ' markers in the file
4875   that careless developers might leave there.
4876   
4877   If you find problems simply by looking at the source files and working
4878   directories, start the flogging now. Resolving the textual conflicts
4879   is the easy part. Weed the turkeys out before reaching the next part
4880   of the cleanup -- the resolution of logical conflicts.
4881   
4882   Then apply a set of post-commit tags.
4883   
4884     Logical Verification -- Diff and powerful eyeballs.
4885   
4886   No source control system can solve the problem of resolving
4887   distributed conflicts in program logic. If you change the argument
4888   template for function A (defined in file A.c) and add new calls to
4889   function A from within function B (defined in file B.c) using the old
4890   argument format, you are outside the realm of CVS's competence.
4891   
4892   Assign someone to understand what the Vendor changed by running "cvs
4893   diff -c -r <PreviousReleaseTag> <ReleaseTag>", where the tags were
4894   those handed to the last two invocations of "import".
4895   
4896   Then have the same person compare that output (logically or you can
4897   actually diff the diffs) to the output of the similar "cvs diff -c -r
4898   <pre-import-tag> <post-commit-tag>". The two sets of differences
4899   should be almost identical. They should both show only the work *you*
4900   have performed.
4901   
4902     Product Verification -- Build and Test.
4903   
4904   Don't let your help off the hook until you verify that the merge
4905   actually produced something that can compile and pass tests. Compiling
4906   should really be part of the logical verification phase, but you
4907   should test the output of the build system before declaring victory
4908   and releasing the troops.
4909   
4910     After it is all built, apply another set of tags to mark the end of
4911   the "import process". You can delete the intermediate tags you added
4912   during source and logic testing, but keep the "pre-import" and
4913   "post-import" tags forever.
4914   
4915   Of course, experience can tell you when to skip a step. But I'd start
4916   out by considering each one as necessary unless you can prove
4917   otherwise.
4918   
4919   Last modified: _6/13/1997_
4920   
4921    14. Explain: ERROR: cannot create link to <file>: Permission denied 
4922    
4923   This error appears when you try to execute a second (or later)
4924   "import" into the same module from a directory to which you don't have
4925   write access.
4926   
4927   The "link error" is caused by a feature purposely added to speed up
4928   the import.
4929   
4930   Though the error message is somewhat strange, it indicates that
4931   "import" is supposed to be executed only in writable directories.
4932   
4933   Last modified: _6/13/1997_
4934   
4935    15. Where does the -m <message> go when the file doesn't change? 
4936    
4937   The <message> handed to import is used as an RCS log message, but only
4938   if the imported file changed since the last version on the Vendor
4939   branch. If the imported file hasn't changed, then no new revision is
4940   created. The <ReleaseTag> is still applied, but to the previous
4941   revision. So the Tags are still correct, but the message is lost.
4942   
4943   Maybe it should be appended to the previous log message. But currently
4944   it isn't.
4945   
4946   Last modified: _6/13/1997_
4947   
4948    16. How do I "import" just the files ignored by a previous "import"? 
4949    
4950   A real answer follows, but first, an editorial:
4951   
4952   I am now convinced that you should always use the "-I !" option.
4953   Removing a few extraneous files from the Repository is a lot easier
4954   than the recovery step described below.
4955   
4956   Let's assume your original import procedure was: (We assume there is
4957   enough disk space in /tmp.)
4958   
4959   cd <head-of-vendor-tree>
4960            cvs import -m 'xyz 1.3' gnu/xyz GNU GNUXYZ_1_3 | tee /tmp/IMP
4961
4962   To import just the files ignored by "import", I would do this:
4963   
4964     Create a list of the ignored files to import:
4965   
4966   cd <head-of-vendor-tree> awk '/^I / {print $2}' /tmp/IMP | sed
4967   's|^gnu/xyz/||' > /tmp/IG [Edit the IG file to contain just the files
4968   you want.]
4969   
4970     Then create a sparse directory by handing your list to the GNU
4971   version of "tar", installed in many places as "gtar":
4972   
4973   mkdir /tmp/FIXUP gtar -T /tmp/IG -c -f - . | (cd /tmp/FIXUP; gtar xvBf
4974   -)
4975   
4976     Then rerun the import. Use the exact same command, but execute it in
4977   the sparse directory tree you just created. And this time, tell it not
4978   to ignore anything.
4979   
4980   cd /tmp/FIXUP
4981           cvs import -I ! -m 'xyz 1.3' gnu/xyz GNU GNUXYZ_1_3
4982
4983   Last modified: _6/13/1997_
4984   
4985    17. Why did "import" ignore all the symlinks? 
4986    
4987   This is another design choice.
4988   
4989   Like the Unix "tar" command, "import" could sprout an option to follow
4990   symbolic links, but I don't think CVS will ever follow symbolic links
4991   by default.
4992   
4993   Two possible future enhancements have been seriously discussed:
4994   
4995     Treat symbolic links as data in its parent directory (the way
4996   ClearCase does) in some sort of per-directory control file.
4997   
4998     Treat symbolic links as version-controlled elements themselves,
4999   whose data is the value of readlink(2).
5000   
5001   For now, they are simply ignored.
5002   
5003   If you want to save and reconstruct symlinks, you might want to define
5004   a "checkout" or "update" program in the modules file which could
5005   consult a file kept under CVS in your working directory and make sure
5006   the specified links are in place.
5007   
5008   Last modified: _6/13/1997_
5009   
5010  Category: /Commands_/log_lo_rlog/
5011  
5012   " + "log", "lo", "rlog""
5013   
5014    1. What is "log" for? 
5015    
5016   To provide an interface to the RCS "rlog" command, which displays
5017   information about the underlying RCS files, including the revision
5018   history and Tag (RCS calls it a "symbol") list.
5019   
5020   Last modified: _6/13/1997_
5021   
5022    2. How do I extract the log entries between two revisions? 
5023    
5024   If both <rev1> and <rev2> are on the same branch, you can get what you
5025   are looking for with: (If they aren't on the same branch you'll either
5026   get an error or a display of the whole change log.)
5027   
5028                cvs log -r<rev1>:<rev2> <file>
5029
5030   If you want all the revisions on the branch from <rev1> to the end of
5031   the branch <rev1> is on, you can use:
5032   
5033                cvs log -r<rev1>: <file>
5034
5035   (If <rev1> is a numeric RCS symbol attached to a branch revision with
5036   an even number of '.'s in it, you get the whole branch.)
5037   
5038   If you want all the revisions on the branch from the beginning of the
5039   branch <rev2> is on up to revision <rev2>, you can use:
5040   
5041                cvs log -r:<rev2> <file>
5042
5043   Note: Depending on whether <rev1> and <rev2> are:
5044   
5045                        - numeric or symbolic
5046                        - in the file or not
5047                        - on the same branch or not
5048
5049                the RCS "rlog" (and therefore the "cvs log") command will
5050                display some combination of:
5051
5052                        - error messages
5053                        - (intuitively correct) partial log listings
5054                        - a display of the entire change log.
5055
5056   Last modified: _6/13/1997_
5057   
5058    3. How do I extract the log entries on a whole branch? 
5059    
5060                cvs log -r<rev> <file>
5061
5062   where <rev> must be a branch revision (one with an even number of
5063   dots) or a *non-branch* tag on a branch revision. Non-branch tags on a
5064   branch revision are not normally attached by CVS, to add one you will
5065   have to explicitly tag a physical branch number within each file.
5066   Since these branch numbers are almost never the same in different
5067   files, this command is not all that useful.
5068   
5069   The intuitive command (at least from the CVS perspective):
5070   
5071                cvs log -r<branch_tag> <file>
5072
5073   does not work.
5074   
5075   Last modified: _6/13/1997_
5076   
5077    4. How do I generate ChangeLogs from RCS logs? 
5078    
5079   A program called rcs2log is distributed as part of GNU Emacs 19. A
5080   (possibly older) version of this program appears in the contrib
5081   directory of the cvs source tree.
5082   
5083   Last modified: _6/13/1997_
5084   
5085    5. Why does "log" tell me a file was committed exactly 5 hours later 
5086    
5087   than I know it was?
5088   
5089   I can tell by this question that you were working in a time zone that
5090   is 5 hours behind GMT (e.g. the U.S. East Coast in winter).
5091   
5092   RCS file dates are stored in GMT to allow users in different time
5093   zones to agree on the meaning of a timestamp. At first glance this
5094   doesn't seem necessary, but many companies use distributed file
5095   systems, such as NFS or AFS, across multiple timezones.
5096   
5097   Some standard form must be used. GMT, as the "grid origin", is an
5098   obvious candidate. The only other reasonable choice is to put the
5099   timezone information in all the time stamps, but that changes the RCS
5100   file format incompatibly, a step which has been avoided in the last
5101   few RCS releases.
5102   
5103   Last modified: _6/13/1997_
5104   
5105  Category: /Commands_/patch_pa_rdiff/
5106  
5107   " + "patch", "pa", "rdiff""
5108   
5109    1. What is "patch" for? 
5110    
5111   To produce a "diff" between tagged releases to be handed to the
5112   "patch" command at other sites. This is the standard way that source
5113   patches are distributed on the network.
5114   
5115   Last modified: _6/13/1997_
5116   
5117    2. Why does "patch" include files from the Attic when I use '-D'? 
5118    
5119   See the explanation of the same problem with "update -D" contained in
5120   section 5B.
5121   
5122   Last modified: _6/13/1997_
5123   
5124    3. How do I make "patch" produce a patch for one or two files? It seems to
5125    work only with modules. 
5126    
5127   Patch is intended for producing patches of whole modules between
5128   releases to be distributed to remote sites. Instead of "patch", you
5129   can use the "diff" command with the '-c' context option:
5130   
5131             cvs diff -c -r <rev/tag> -r <rev/tag> <file1> . . .
5132
5133   The patch command will be able to merge such a "diff" into the remote
5134   source files.
5135   
5136   If you configured CVS to use a version of "diff" that supports the
5137   '-u' option, you can produce a more compact "patch" in "unidiff"
5138   format. The latest revisions of the patch command can parse and apply
5139   patches in "unidiff" format.
5140   
5141   Last modified: _6/13/1997_
5142   
5143  Category: /Commands_/release_re_rel/
5144  
5145   " + "release", "re", "rel""
5146   
5147    1. What is "release" for? 
5148    
5149   To register that a module is no longer in use. It is intended to
5150   reverse the effects of a "checkout" by adding a record to the history
5151   file to balance the checkout record and by optionally allowing you to
5152   delete the checked-out directory associated with the module name.
5153   
5154   Last modified: _6/13/1997_
5155   
5156    2. Why can't I reverse a "cvs checkout path/name/subdir" with a "cvs
5157    release path/name/subdir" without an "unknown module name"? 
5158    
5159   A simplistic implementation. (I can say this -- I wrote it.)
5160   
5161   The "release" function was written for CVS 1.2 under the assumption
5162   that the "module name" is a first class, unavoidable interface to the
5163   Repository, allowing no way to retrieve anything other than by module
5164   name. Though it is easier to program that way, many users of CVS
5165   believe the modules support to be too primitive to allow such a
5166   limitation.
5167   
5168   Since "release" was written, other parts of CVS broke that assumption.
5169   It needs to be revised.
5170   
5171   Last modified: _6/13/1997_
5172   
5173    3. Why can't I "release" portions of a checked out directory? I should be
5174    able to "release" any file or sub-directory within my working directory. 
5175    
5176   This isn't really a limitation in "release", per se. CVS doesn't try
5177   to keep track of which files in which directories are "checked out"
5178   and which are just lying there. You can delete directories and
5179   "update" will not bring them back unless you add a special "-d"
5180   option.
5181   
5182   In other words, CVS doesn't keep track of how you adjust the partition
5183   between files you consider part of your working set and files that
5184   were checked out because they are part of the same module or
5185   directory. And neither does "release".
5186   
5187   In future CVS releases, "release" might become sophisticated enough to
5188   handle both the reversal of a "checkout" and the deletion of random
5189   portions of the working directory, but it isn't that way now.
5190   
5191   Last modified: _6/13/1997_
5192   
5193    4. I removed the tree that I was about to start working on. How do I tell
5194    cvs that I want to release it if I don't have it anymore? 
5195    
5196   See 3G.4.
5197   
5198   Last modified: _6/13/1997_
5199   
5200    5. Why doesn't "release -d module" reverse a "checkout module"? 
5201    
5202   It does, if you are using "module" in a way that "release" expects: a
5203   non-alias string in the left column of the "modules" database.
5204   
5205   If "module" is really an alias, or if you are using a relative path in
5206   the place of "module", or if you renamed the directory with the -d
5207   option in the modules file or on the "checkout" command line, then the
5208   current version of "release" won't work.
5209   
5210   Future versions of "release" will probably fix most of these.
5211   
5212   Last modified: _6/13/1997_
5213   
5214    6. Why can't I release a module renamed with "cvs checkout -d"? 
5215    
5216   The current version of "release" doesn't know how to track the
5217   renaming option ('-d') of the "checkout" command. It will probably be
5218   fixed in the future.
5219   
5220   Last modified: _6/13/1997_
5221   
5222  Category: /Commands_/remove_rm_delete/
5223  
5224   " + "remove", "rm", "delete""
5225   
5226    1. What is "remove" for? 
5227    
5228   To remove a file from the working branch. It removes a file from the
5229   main branch by placing it in an "Attic" directory.
5230   
5231   Last modified: _6/13/1997_
5232   
5233    2. Why doesn't "remove" work on directories when it appears to try? 
5234    
5235   Oversight. It should be able to delete an empty directory, but you
5236   still don't have a way to remember when it was there and when it
5237   disappeared to allow the "-D " option to work.
5238   
5239   You'll have to remove the working directory and the matching directory
5240   in the Repository.
5241   
5242   Note that you want to do a _cvs remove dir_ in the working directory,
5243   do a cvs commit, and then do a _rmdir dir_ in the Repository.
5244   (msusrtsp.mark at eds dot com)
5245   
5246   Last modified: _12/18/1997_
5247   
5248    3. I don't like removing files. Is there another way to ignore them? 
5249    
5250   There's no reason to be hasty in using the "remove" command.
5251   
5252   If there is a way to ignore files in your build procedures, I'd just
5253   do that. Later, when you decide that the files are really ancient, you
5254   can execute a "remove" command to clean up.
5255   
5256   The CVS "ignore" concept can't ignore files already in CVS.
5257   
5258   Last modified: _6/13/1997_
5259   
5260    4. I just removed a file. How do I resurrect it? 
5261    
5262   If you executed "remove", but haven't typed "commit" (you can tell
5263   this by the 'R' notation that "update" prints next to the file), you
5264   can execute "add" to reverse the "remove".
5265   
5266   If you followed the "remove" with a "commit", you'll have to move it
5267   back out of the Attic by hand:
5268   
5269   I use something like this: (csh-like syntax)
5270   
5271                set repos = `cat ./CVS/Repository`
5272                mv $repos/Attic/filename,v $repos/filename,v
5273
5274   (If you use relative paths in your Repository files, that first line
5275   becomes: set repos = $CVSROOT/`cat ./CVS/Repository`)
5276   
5277   While a file is in the Attic, you can't "add" another file by the same
5278   name. To add such a file you either have to move it by hand as in the
5279   above, or delete it from the Attic.
5280   
5281   The main reason for the Attic is to retain files with tags in them. If
5282   you execute: "update -r <oldtag>", files with <oldtag> attached to
5283   some revision will be taken from the normal Repository area and from
5284   the Attic. That's why you can't "add" a file with the same name.
5285   "remove" only moves a file off the main branch, it doesn't obliterate
5286   it.
5287   
5288   Last modified: _6/13/1997_
5289   
5290    5. Why doesn't "remove" delete the file? Instead, it prints an error
5291    message and tells me to remove the file by hand. 
5292    
5293   Design choice. Unix software written within last decade, usually
5294   requires an extra verification step, such as answering a question or
5295   adding a flag on the command line. CVS currently requires that you
5296   delete the file first unless you specify the '-f' (force) option,
5297   which deletes the file before performing "cvs remove".
5298   
5299   Last modified: _6/13/1997_
5300   
5301  Category: /Commands_/rtag_rt_rfreeze/
5302  
5303   " + "rtag", "rt", "rfreeze""
5304   
5305    1. What is "rtag" for? 
5306    
5307   To add a symbolic label (a "tag") to the last committed revisions of a
5308   module directly in the Repository.
5309   
5310   Last modified: _6/13/1997_
5311   
5312    2. Why use "rtag"? It assumes no one is changing the Repository. 
5313    
5314   Though the "tag" command is more useful in marking the revisions you
5315   have in a particular working directory, "rtag" is much handier for
5316   whole-Repository actions, which occur at major release boundaries.
5317   
5318   Last modified: _6/13/1997_
5319   
5320    3. What revision does "rtag -r <tag1> <tag2>" actually put the tag on? 
5321    
5322   In short, the '-r' option is another way to select the revision to
5323   tag. The revision is selected the same way for all commands that
5324   accept a "-r <tag/rev>" option.
5325   
5326   Depending on whether <tag1> is a <branch_tag>, or a non-branch <tag>
5327   and on whether you use the '-b' option to "rtag", you get four
5328   different results:
5329   
5330     rtag -r <tag1> <tag2>
5331   
5332   Adds the non-branch tag <tag2> to the same revision that the
5333   non-branch tag <tag1> is attached to.
5334   
5335   Example:
5336                <tag1>          --> TT1
5337                <tag2>          --> TT2
5338                <file>          --> Symbols: TT1:1.4
5339                After           --> Symbols: TT1:1.4,TT2:1.4
5340
5341     rtag -r <branch_tag1> <tag2>
5342   
5343   Adds the non-branch tag <tag2> to the HEAD of (the highest revision
5344   number on) the branch labelled with tag <branch_tag1>.
5345   
5346   Example:
5347                <branch_tag1>   --> BR1
5348                <tag2>          --> TT2
5349                <file>          --> Symbols: BR1:1.2.0.2 (1.2.2.5 is HEAD)
5350                After           --> Symbols: BR1:1.2.0.2,TT2:1.2.2.5
5351
5352   If the branch tagged by <branch_tag1> has not been created, then the
5353   tag shows up on the branch point revision:
5354   
5355   Example:
5356                <branch_tag1>   --> BR1
5357                <tag2>          --> TT2
5358                <file>          --> Symbols: BR1:1.2.0.2 (No 1.2.X exists.)
5359                After           --> Symbols: BR1:1.2.0.2,TT2:1.2
5360
5361     rtag -b -r <tag1> <branch_tag2>
5362   
5363   Adds the magic branch tag <branch_tag2> to the revision that the
5364   non-branch tag <tag1> is attached to, preparing it to be a branch
5365   point.
5366   
5367   Example:
5368                <tag1>          --> TT1
5369                <branch_tag2>   --> BR2
5370                <file>          --> Symbol: TT1:1.4
5371                After           --> Symbol: TT1:1.4, BR2:1.4.0.2
5372
5373     rtag -b -r <branch_tag1> <branch_tag2>
5374   
5375   Adds the magic branch tag <branch_tag2> to the revision at the HEAD of
5376   (the highest revision number on) the branch labelled with
5377   <branch_tag1>, preparing it to be a branch point.
5378   
5379   Example:
5380                <branch_tag1>   --> BR1
5381                <branch_tag2>   --> BR2
5382                <file>          --> Symbol: BR1:1.2.0.2 (1.2.2.5 is HEAD)
5383                After           --> Symbol: BR1:1.2.0.2,BR2:1.2.2.5.0.2
5384
5385   If the branch tagged by <branch_tag1> has not been created, then the
5386   tag shows up as a second branch off the same branch point revision:
5387   
5388   Example:
5389                <branch_tag1>   --> BR1
5390                <tag2>          --> TT2
5391                <file>          --> Symbols: BR1:1.2.0.2 (No 1.2.X exists.)
5392                After           --> Symbols: BR1:1.2.0.2,TT2:1.2.0.4
5393
5394   In all four cases above, if <tag2> already exists on the file, you get
5395   an error unless you specify the '-F' option.
5396   
5397   In all four cases, if <tag1> does not exist on the file, <tag2> is not
5398   added unless you specify the '-f' option.
5399   
5400   Last modified: _6/13/1997_
5401   
5402    4. What happens if the tags are the same in "rtag -r <tag> <tag>"? 
5403    
5404   Again, there are four cases depending on whether <tag> is a branch
5405   tag, or a non-branch tag and on whether you use the '-b' option to
5406   "rtag":
5407   
5408     rtag -r <tag> <tag>
5409   
5410   Is a no-op. It does nothing even with '-F' specified.
5411   
5412   If you add the '-f' option ("rtag -f -r <tag> <tag>"), then <tag> is
5413   attached to the latest revision on the Main Branch if the file does
5414   *not* already have <tag> on some revision.
5415   
5416   If the <tag> is already on the file, using "rtag -f" is still a no-op.
5417   
5418     rtag -r <branch_tag> <branch_tag>
5419   
5420   Produces an error, since the <branch_tag> is already on some revision
5421   of the file.
5422   
5423   But, "rtag -F -r <branch_tag> <branch_tag>" turns the magic branch tag
5424   into a non-branch tag.
5425   
5426   Symbols: BR1:1.4.0.2 becomes Symbols: BR1:1.4
5427   
5428     rtag -b -r <tag> <tag>
5429   
5430   Produces an error, since the <tag> is already on the file.
5431   
5432   But, "rtag -F -b -r <tag> <tag>" turns the non-branch tag into a magic
5433   branch tag.
5434   
5435   Symbols: BR1:1.4 becomes Symbols: BR1:1.4.0.2
5436   
5437     rtag -b -r <branch_tag> <branch_tag>
5438   
5439   Produces an error, since the <branch_tag> is already on the file.
5440   
5441   But, "rtag -F -b -r <branch_tag> <branch_tag>" increments the branch
5442   number. It essentially removes the branch and creates a new one by the
5443   same name.
5444   
5445   Symbols: BR1:1.2.0.4 becomes Symbols: BR1:1.2.0.6
5446   
5447   Last modified: _6/13/1997_
5448   
5449    5. Why doesn't "rtag -b -r <branch_tag1> <branch_tag2>" rename or duplicate
5450    a magic branch tag? 
5451    
5452   None of the "tag" or "rtag" options rename anything. They only apply
5453   (or, with the '-F' option, move) tags to specific revisions in the
5454   file.
5455   
5456   See 3M.[3-4] above for details of how it works.
5457   
5458   To rename a non-branch tag, see 3O.9. To rename a magic branch tag,
5459   see 4D.5
5460   
5461   Last modified: _6/13/1997_
5462   
5463  Category: /Commands_/status_st_stat/
5464  
5465   " + "status", "st", "stat""
5466   
5467    1. What is "status" for? 
5468    
5469   To display the status of files, including the revision and branch you
5470   are working on and the existence of "sticky" information.
5471   
5472   Last modified: _6/13/1997_
5473   
5474    2. Why does "status" limit the File: at the top to 17 characters? 
5475    
5476   Designed that way to line up with other data. You can find the whole
5477   filename in the line beginning with "RCS version:", which is not
5478   limited in length.
5479   
5480   Last modified: _6/13/1997_
5481   
5482    3. Why does it print "Sticky" lines when the values are "(none)"? 
5483    
5484   Oversight. It should probably elide lines without information.
5485   
5486   Last modified: _6/13/1997_
5487   
5488    4. Shouldn't the status "Needs Checkout" be "Needs Update"? 
5489    
5490   Probably.
5491   
5492   [[Did this show up in CVS 1.4?]]
5493   
5494   Last modified: _6/13/1997_
5495   
5496  Category: /Commands_/tag_ta_freeze/
5497  
5498   " + "tag", "ta", "freeze""
5499   
5500    1. What is "tag" for? 
5501    
5502   To add a symbolic label (a "tag") to the RCS files last checked out,
5503   updated or committed in a working directory.
5504   
5505   Last modified: _6/13/1997_
5506   
5507    2. What is the difference between "tag" and "rtag"? 
5508    
5509   The end result of both commands is that a <tag>, or symbolic name, is
5510   attached to a single revision in each of a collection of files.
5511   
5512   The differences lie in:
5513   
5514     The collection of files they work on.
5515   
5516   "rtag" works on the collection of files referred to by a "module" name
5517   as defined in the "modules" file, or a relative path within the
5518   Repository.
5519   
5520   "tag" works on files and directories specified on the command line
5521   within the user's working directory. (Default is '.')
5522   
5523   Both commands recursively follow directory hierarchies within the
5524   named files and directories.
5525   
5526     The revisions they choose to tag.
5527   
5528   "rtag" places a tag on the latest committed revision of each file on
5529   the branch specified by the '-r' option. By default it tags the Main
5530   Branch.
5531   
5532   "tag" places a tag on the BASE (i.e. last checked out, updated or
5533   committed) revision of each file found in the working directory. (The
5534   BASE revision of a file is the one stored in the ./CVS/Entries file.)
5535   
5536     A different set of command line options.
5537   
5538   For example, "rtag" takes a "-r <oldtag>" option to retag an existing
5539   tag. The "tag" command does not.
5540   
5541     How it is logged.
5542   
5543   Currently "rtag" records the <tag> and the module in the "history"
5544   file, while "tag" does not.
5545   
5546   Last modified: _6/13/1997_
5547   
5548    3. Why does "tag -b" not put a tag on the Branch Point revision? How do I
5549    refer to the Branch Point? 
5550    
5551   This is probably an oversight, or a disbelief in the need for it. If
5552   everything works perfectly, the "update -j" command will do the merge
5553   you need and you don't need to check up on it by playing with the
5554   branch point revision.
5555   
5556   The '-b' option attaches a magic branch tag to allow CVS later to
5557   figure out the branch point. The actual revision that <tag> is
5558   attached to does not exist. References to the branch tag are
5559   equivalent to references to the latest revision on the branch.
5560   
5561   There is no way to refer to the branch point without adding a
5562   non-branch tag. You might want to add non-branch tags as a habit and
5563   add branch tags later, possibly immediate after adding the non-branch
5564   tag. See 4C.3 on Creating a Branch.
5565   
5566   Last modified: _6/13/1997_
5567   
5568    4. So "{r}tag" labels a bunch of files. What do you use a Tag for? 
5569    
5570   You use it to "checkout" the labeled collection of files as a single
5571   object, referring to it by name.
5572   
5573   Anywhere a revision number can be used a Tag can be used. In fact tags
5574   are more useful because they draw a line through a collection of
5575   files, marking a development milestone.
5576   
5577   The way to think about a Tag is as a curve drawn through a matrix of
5578   filename vs. revision number. Consider this:
5579   
5580   Say we have 5 files (in some arbitrary modules, some may be in 2 or
5581   more modules by name, some may be in 2 or more modules because of the
5582   Repository tree structure) with the following revisions:
5583   
5584                file1   file2   file3   file4   file5
5585
5586                1.1     1.1     1.1     1.1  /--1.1*      <-*-  <tag>
5587                1.2*-   1.2     1.2    -1.2*-
5588                1.3  \- 1.3*-   1.3   / 1.3
5589                1.4          \  1.4  /  1.4
5590                              \-1.5*-   1.5
5591                                1.6
5592
5593   At some time in the past, the '*' versions were tagged. Think of the
5594   <tag> as a handle attached to the curve drawn through the tagged
5595   revisions. When you pull on the handle, you get all the tagged
5596   revisions. Another way to look at it is that you draw a straight line
5597   through the set of revisions you care about and shuffle the other
5598   revisions accordingly. Like this:
5599   
5600                file1   file2   file3   file4   file5
5601
5602                                1.1
5603                                1.2
5604                        1.1     1.3                       _
5605                1.1     1.2     1.4     1.1              /
5606                1.2*----1.3*----1.5*----1.2*----1.1     (--- <-- Look here
5607                1.3             1.6     1.3              \_
5608                1.4                     1.4
5609                                        1.5
5610
5611   I find that using these visual aids, it is much easier to understand
5612   what a <tag> is and what it is useful for.
5613   
5614   Last modified: _6/13/1997_
5615   
5616    5. How do I get "tag" and "rtag" to send mail the way "commit" does? 
5617    
5618   The "commit" command is supported by two files ("commitinfo" and
5619   "loginfo") not used by other commands. To do logging the same way for
5620   "tag" and "rtag" would require another file like loginfo, which
5621   currently doesn't exist.
5622   
5623   The "rtag" command requires a "module" entry, which can specify a
5624   "tag" program using the "-t programname" option on the module line.
5625   
5626   There is no equivalent support for "tag".
5627   
5628   Last modified: _6/13/1997_
5629   
5630    6. Why can't "tag" handle the '-r' option that "rtag" takes? 
5631    
5632   Oversight. The answer is probably "Fixed in a Future Release."
5633   
5634   Last modified: _6/13/1997_
5635   
5636    7. After a "tag <tag>" in my working directory, why doesn't "checkout -r
5637    <tag>" somewhere else produce copies of my current files? 
5638    
5639   The only reason this would fail, other than misspelling the <tag>
5640   string, is that you didn't "commit" your work before "tagging" it.
5641   Only committed revisions may be tagged. Modified files are not marked
5642   for later tagging.
5643   
5644   Last modified: _6/13/1997_
5645   
5646    8. Why doesn't "tag" write a history record the way "rtag" does? 
5647    
5648   The "rtag" command was originally intended to place major "release"
5649   tags onto modules. The "tag" functionality was developed to *move* the
5650   more significant tag when slight changes to individual files sneaked
5651   in after the release tag was stamped onto the Repository.
5652   
5653   The significant event was the "rtag", which was recorded in the
5654   "history" file for the "history -T" option to work.
5655   
5656   It turns out that "tag" is generally more useful than "rtag", so the
5657   model has changed. Future revisions of CVS will probably store both
5658   kinds of tags in the history file.
5659   
5660   Last modified: _6/13/1997_
5661   
5662    9. How do I rename a <tag>? 
5663    
5664   For a procedure to rename a branch tag, See section 4D.5 The following
5665   covers only non-branch tags.
5666   
5667   First, pick a <newtag> that is not in use. You could reuse (i.e. move)
5668   an existing tag to the new revisions using the '-F' option, but that
5669   will confuse matters when both tags are not already on a file. (It
5670   will probably confuse "rtag -f" too.)
5671   
5672   Use "rtag" to place <newtag> only on revisions attached to <oldtag> in
5673   the whole Repository, then delete the old one.
5674   
5675                cvs rtag -r <oldtag> <newtag> world
5676                cvs rtag -d <oldtag> world.
5677
5678   You can also checkout or update your working directory to the <oldtag>
5679   and "tag" rather than "rtag" the result. But that will take longer and
5680   it has the chance of producing conflicts.
5681   
5682                cvs update -r <oldtag>
5683                cvs tag <newtag>
5684                cvs tag -d <oldtag>
5685                cvs update -A  (or cvs update -r <previous_tag>)
5686
5687   Last modified: _6/13/1997_
5688   
5689  Category: /Commands_/update_up_upd/
5690  
5691   " + "update", "up", "upd""
5692   
5693    1. What is "update" for? 
5694    
5695   The "update" command is by far the most important command and is
5696   probably also the most used command.
5697   
5698   It has five purposes: (And many options.)
5699   
5700     To display the status of your working files.
5701   
5702   Though a plain "update" also displays the status, it does so after
5703   possibly altering your working directory. To see the status of your
5704   working files without changing anything, type:
5705   
5706                cvs -n update {optional list of files}
5707
5708     To merge changes made by others to the branch you are working on
5709   into your working files.
5710   
5711   Each working directory is attached to a branch, usually the Main
5712   branch. To merge changes made on your working branch since your last
5713   checkout, update or commit, type:
5714   
5715   cvs update {optional list of files}
5716   
5717     To merge changes made on another branch into the branch you are
5718   working on (your "working branch").
5719   
5720   If you want to grab a whole branch, from the branch point, which is
5721   assumed to be on the Main Branch, to the end of the branch, you type:
5722   
5723                cvs update -j <branch_tag> {optional files}
5724
5725   If you want to grab the changes made between two tags or revisions,
5726   you type:
5727   
5728                cvs update -j <tag1> -j <tag2> {optional files}
5729
5730   (If you are working with a single file, the Tags could also be
5731   revisions numbers. Unless you take great care to match revision
5732   numbers across different files (a waste of time given the way Tags
5733   work), using revision numbers in place of the Tags for multiple files
5734   would be meaningless.)
5735   
5736     To move your working directory to another branch.
5737   
5738   A working directory is presumed to be attached to (or working on) a
5739   particular branch, usually the Main branch. To alter what CVS believes
5740   to be your working branch, you "move" to that branch.
5741   
5742   To move to a tagged branch, type:
5743   
5744                cvs update -r <branch_tag> {optional files}
5745
5746   To move to the Main Branch, type:
5747   
5748                cvs update -A {optional files}
5749
5750   If you have modified files in your working directory, this is not a
5751   clean move. CVS will attempt to merge the changes necessary to make it
5752   look like you made the same changes to the new branch as you made in
5753   the old one. But if you do this twice without resolving the merge
5754   conflicts each time, you can lose work.
5755   
5756     To retrieve old revisions of files.
5757   
5758   This option is similar to 4 above but you are not restricted to using
5759   a <branch_tag>. You may specify any revision or <tag> with '-r' and
5760   get the specified revision or the tagged revision:
5761   
5762                cvs update -r <tag/rev> {optional files}
5763
5764   Or you may specify any date with '-D':
5765   
5766                cvs update -D <date> {optional files}
5767
5768   The '-p' option sends the revisions to standard output (normally your
5769   terminal) rather than setting the "sticky" tag and changing the files.
5770   
5771   Last modified: _6/13/1997_
5772   
5773    2. What do 'U', 'M' and 'C' mean when I type "update"? Are they different
5774    for "cvs -n update"? 
5775    
5776   "cvs update" merges changes made to the Repository, since your last
5777   "checkout", "update" or "commit", into your working files. You can
5778   think of it as changing your BASE revision.
5779   
5780   "cvs update" prints lines beginning with:
5781   
5782   'U' after replacing your unmodified file with a different
5783                revision from the Repository.
5784
5785   'M' for two different reasons:
5786   
5787     for files you have modified that have not changed in the Repository.
5788   
5789     after a merge, if it detected no conflicts.
5790   
5791   'C' after a merge, if it detected conflicts. See 2D.7 and 3P.6 for
5792   more info on conflict resolution and "sticky conflicts."
5793   
5794   "cvs -n update" shows what it *would* do, rather than doing it. Or,
5795   another way of looking at it, "cvs -n update" displays the
5796   relationship between your current BASE revisions (identified in your
5797   ./CVS/Entries file) and the HEAD revisions (the latest revisions in
5798   the Repository).
5799   
5800   "cvs -n update" prints lines beginning with:
5801   
5802   'U' for files you have not modified that have changed in the
5803   Repository.
5804   
5805   'M' for files you have modified that have not changed in the
5806   Repository.
5807   
5808   'C' for files you have modified that have also been changed in the
5809   Repository.
5810   
5811   See 4C.6 for what the letters mean when merging in from another
5812   branch. The output is almost the same for a normal update if you
5813   consider the Repository as the branch and your working directory as
5814   the "trunk".
5815   
5816   Last modified: _6/13/1997_
5817   
5818    3. What's the difference between "update" and "checkout"? 
5819    
5820   See 3C.4 above.
5821   
5822   Last modified: _6/13/1997_
5823   
5824    4. Why don't I get new files when I execute "update"? 
5825    
5826   There are six reasons for nothing to happen during an "update":
5827   
5828     Nothing on your branch changed in the Repository.
5829   
5830   If no one has committed anything to the branch you are working on
5831   (normally the Main branch) since the last time you executed
5832   "checkout", "update" or "commit", nothing will happen.
5833   
5834   It's like shouting "xyzzy" or "plugh" in the wrong room.
5835   
5836     You have a "sticky" non-branch <tag> or <date> attached to the
5837   working files you are trying to "update".
5838   
5839   At some time in the past you checked out or updated your directory
5840   with the "-r <tag>" or "-D <date>" option. Until you do it again with
5841   a different tag or date, or go back to the Main Branch with "update
5842   -A", you will never again see any updates.
5843   
5844     The ./CVS/Entries.Static file exists and you are expecting a new
5845   file.
5846   
5847   If your ./CVS administrative directory contains a file named
5848   Entries.Static, no files will be checked out that aren't already in
5849   the Entries or Entries.Static file.
5850   
5851     You forgot to use the '-d' option and are looking for new
5852   directories.
5853   
5854   If you execute "update" without the '-d' option, it will not create
5855   new directories that have been added to the Repository.
5856   
5857     You typed "update" instead of "cvs update".
5858   
5859   On most Unix systems, your disk caches are now furiously being flushed
5860   by multiple update daemons, destroying performance and proving to
5861   management that you need more CPU power. :-)
5862   
5863   On HP systems you might be asked what package you want to install from
5864   the "update server".
5865   
5866     Someone removed (using "admin -o") your BASE revision (the revision
5867   CVS thought you had in your working directory), then committed a
5868   "replacement". CVS is now confused because the revision in the
5869   Repository matches your BASE revision when the files themselves don't
5870   match. See 3B.6.
5871   
5872   Last modified: _6/13/1997_
5873   
5874    5. Why does "update" say 'M' both for plain modified files and for
5875    successful (i.e. conflict-free) merges? Aren't they different? 
5876    
5877   A design choice. Yes, they are different internally, but that
5878   shouldn't matter. Your files are in the same condition after the
5879   "update" as they were before -- a "diff" will display only your
5880   modifications. And you are expected to continue onward with parts two
5881   and three of the normal development cycle: "emacs" (a synonym for
5882   "edit" in most of the civilized world) and "commit".
5883   
5884   Last modified: _6/13/1997_
5885   
5886    6. What's a "sticky conflict"? How does it know a conflict occurred? 
5887    
5888   When a "cvs update" (or an "update -j") creates a conflict, it prints
5889   a 'C' and stores the timestamp of the file after the merge in a
5890   special field in the ./CVS/Entries file.
5891   
5892   This conflict indication implies that the merge command altered your
5893   working file to contain conflict markers surrounding the overlapping
5894   code segments. For example, say that
5895   
5896   - Two developers acquire revision 1.2 of <file> via "checkout" or
5897   "update".
5898   
5899   - Developer A changes line 1 from "9999" to "5555", then commits the
5900   file, creating revision 1.3.
5901   
5902   - Developer B changes line 1 from "9999" to "7777", then tries to
5903   commit the file, but is blocked because the file is not up to date.
5904   Developer B then runs "update" and sees the conflict marker 'C'. The
5905   beginning of the file would look like this:
5906   
5907   <<<<<<< <file> The working <file> in question.
5908            7777                Change made to the working <file>.
5909            =======
5910            5555                Change made in the first commit (1.3)
5911            >>>>>>> 1.3         The revision created by the first commit.
5912
5913   The conflict is "sticky", which means that until the conflict is
5914   cleared, the "update" command will continue to display the file's
5915   status as 'C' and the "status" command will show the file's status as
5916   "Unresolved Conflict".
5917   
5918   Until the conflict is cleared, "commit" is blocked for this file.
5919   
5920   The sticky conflict indicator can be cleared by:
5921   
5922     Resolving the conflict by editing the file. Two things must happen
5923   before the conflict is considered resolved:
5924   
5925   The timestamp of the file must change. *and* The file must contain no
5926   conflict markers. (The string searched for in the file is the regexp:
5927   "^>>>>>>> ".)
5928   
5929   After clearing the sticky conflict indicator, you may then commit the
5930   file normally.
5931   
5932     Removing the file and running "update". This throws away the local
5933   changes and accepts the latest committed file on this branch. No
5934   commit is needed.
5935   
5936     Forcing the commit to happen by using "commit -f". This is probably
5937   a mistake since there are few lines of real text that begin with
5938   ">>>>>>> ".
5939   
5940   Last modified: _6/13/1997_
5941   
5942    7. Is there a feature to tell me what I have changed, added and removed
5943    without changing anything? 
5944    
5945   The command "cvs -n update" will do exactly that.
5946   
5947   Last modified: _6/13/1997_
5948   
5949    8. Why were all my files deleted when I executed "update"? 
5950    
5951   You probably executed "update -r <tag>" some time ago, then removed
5952   <tag> from the Repository files. "update -r <tag>" will delete a file
5953   that doesn't contain <tag>.
5954   
5955   A way to fix this is to "cd" into your working directory and type:
5956   
5957                cvs update -A
5958
5959   If you don't want the latest revisions on the Main (or Vendor) Branch,
5960   then decide what Tag (normal or branch) you want and type:
5961   
5962                cvs update -r <the_tag_you_want>
5963
5964   Another way to make a file disappear is to execute "update -D <date>"
5965   where <date> is before the date stamped onto the first revision in the
5966   RCS file.
5967   
5968   Last modified: _6/13/1997_
5969   
5970  Category: /Past__Future_/
5971  
5972   " Past & Future "
5973   
5974  Category: /Past__Future_/Bugs_and_Patches/
5975  
5976   " + Bugs and Patches"
5977   
5978    1. Why can't CVS handle deletion of directories? 
5979    
5980   An oversight, probably. [[Fixed in a future release?]]
5981   
5982   Last modified: _6/13/1997_
5983   
5984    2. Why can't CVS handle the moving of sources from one place in the 
5985    
5986   directory hierarchy to another?
5987   
5988   A "renaming database" has been proposed to track the history of
5989   pathname changes in the Repository. A general solution is a difficult
5990   problem. See 4B.8.
5991   
5992   Last modified: _6/13/1997_
5993   
5994    3. When I typed "cvs update -D <date>", why did it check out all 
5995    
5996   sorts of ancient files from the Attic? Shouldn't it just create the
5997   set of files and revisions that existed at that date?
5998   
5999   This seems to be a bug, but is really the lack of any obvious place to
6000   store the date when a file is "removed".
6001   
6002   There are four ranges of dates that CVS has to deal with when trying
6003   to determine what revision was available on <date>:
6004   
6005     Dates before the earliest revision in the file.
6006   
6007     Dates between any two revisions in the file.
6008   
6009     Dates between the latest revision in the file and the date when the
6010   file was moved to the Attic by "commit".
6011   
6012     Dates after moving the file to the Attic.
6013   
6014   Since the date when a file is moved to the Attic is not stored
6015   anywhere, CVS can't tell the difference between #3 and #4. To avoid
6016   not producing a file that should exist in case #3, it produces
6017   extraneous files in case #4.
6018   
6019   For the above reason, if you have removed files in the Attic, it is
6020   better to use "-r <tag>, or even "-r HEAD" than to use a date spec.
6021   
6022   If you must use "-D <date>", then you should either archive and delete
6023   Attic files (losing some past history) or construct your Makefiles to
6024   work with an explicit list of files and let the old source files stay
6025   in the working directory. The contents of the revision-controlled
6026   Makefile can then be considered to contain deletion "information".
6027   
6028   Last modified: _6/13/1997_
6029   
6030    4. When I typed "cvs update -D <date>" in my branch, why did it screw up
6031    all my files? 
6032    
6033   Currently, the internal routine ("version_ts") that looks up info
6034   about a file, overrides both the tag and date if *either* the tag or
6035   date is specified on the command line. If only the date is specified,
6036   it should not override a branch tag, but it does.
6037   
6038   In CVS 1.3, the documented "-D <branch_tag>:<date>" syntax only works
6039   with the Main Branch and the Vendor Branch.
6040   
6041   [[Is this fixed in CVS 1.4? This is one item I didn't check.]]
6042   
6043   Last modified: _6/13/1997_
6044   
6045    5. When I executed "checkout" into an existing directory I got "No such
6046    file or directory" errors. Why? 
6047    
6048   Though the man page says that "checkout" turns into an "update -d" in
6049   directories that already exist, it is referring to directories that
6050   already exist *and* were created by CVS.
6051   
6052   When you try to run "checkout" on top of an existing directory
6053   structure, some of which wasn't created by CVS, it will handle
6054   directories and non-CVS files within directories already under CVS,
6055   but it will display the above error on non-CVS files within non-CVS
6056   directories.
6057   
6058   Last modified: _6/13/1997_
6059   
6060    6. Why does "update" send all output to the terminal after 26 files have
6061    been updated? 
6062    
6063   CVS uses the "tmpnam()" function to generate temporary file names. The
6064   ANSI standard for the "tmpnam()" function says:
6065   
6066   "The tmpnam function generates a different string each time it is
6067   called, up to TMP_MAX times. If it is called more than TMP_MAX times,
6068   the behavior is implementation defined."
6069   
6070   Later it says that the value of "TMP_MAX shall be at least 25."
6071   
6072   On some platforms, the above specification is taken literally by
6073   turning "at least 25" into "exactly 26" and by doing something foolish
6074   (i.e. "implementation defined") after that. Some systems return the
6075   same name repeatedly, which causes one form of trouble. Others return
6076   NULL or garbage, which causes a different form of trouble.
6077   
6078   The broken systems appear to be cycling a single character through the
6079   alphabet. SunOS cycles 3 characters through the alphabet, so it won't
6080   cause trouble until 26 cubed or 17576 calls to "tmpnam()".
6081   
6082   Since CVS doesn't depend on the exact format of the tmp files, the
6083   workaround is to provide a "tmpnam()" that doesn't have a limit on the
6084   number of calls to it.
6085   
6086   Last modified: _6/13/1997_
6087   
6088    7. Why does the merge occasionally resurrect lines of code? 
6089    
6090   The diff3 program provided by GNU diff version 1.15 has a bug that
6091   occasionally causes text to come back from the dead.
6092   
6093   This is an old problem which you can avoid by upgrading to the latest
6094   GNU "diffutils" package. If you were using GNU diff version 1.15 and
6095   plan to upgrade to the latest GNU diff program, see the next question.
6096   
6097   Last modified: _6/13/1997_
6098   
6099    8. Why does the merge fail when my "rcsmerge" program is configured to use
6100    GNU diff version 2.1 or later? 
6101    
6102   A change in the overlap format was introduced in GNU diff3 between
6103   versions 2.0 and 2.1 that causes RCS versions before 5.6.0.1 to fail
6104   during a merge.
6105   
6106   To get consistent rcsmerge behavior, you have four choices:
6107   
6108     Go back to using GNU diff 1.15 or 2.0 with RCS versions 5.5 or 5.6.
6109   If you want to use GNU diff 2.1 or later, you'll have to pick one of
6110   the other three choices in this list.
6111   
6112     Grab RCS version 5.6.0.1 from an FSF archive and set the DIFF3_A
6113   macro to '1' as it tells you to in the Makefile:
6114   
6115   #define DIFF3_A 1
6116   
6117     Patch the RCS 5.6 source. Change line 84 in "merger.c" from:
6118   
6119   DIFF3, "-am", "-L", label[0], "-L", label[1], to DIFF3, "-amE", "-L",
6120   label[0], "-L", "", "-L", label[1],
6121   
6122     Wait both for RCS version 5.7 to be released and for a new version
6123   of CVS that can deal with it.
6124   
6125   Last modified: _6/13/1997_
6126   
6127  Category: /Past__Future_/Contributors/
6128  
6129   " + Contributors"
6130   
6131    1. Who wrote CVS? 
6132    
6133   Brian Berliner <berliner@sun.com> converted a collection of scripts
6134   written by Dick Grune <dick@cs.vu.nl> into a C program, then added all
6135   sorts of features. He continues to maintain CVS.
6136   
6137   Jeff Polk <polk@bsdi.com> wrote much of the code added between
6138   revisions 1.2 and 1.3. Many others were involved at some level.
6139   
6140   david d zuhn <zoo@armadillo.com> fixed a number of bugs, added some of
6141   the new features, reworked the whole thing to be more portable, and
6142   provided much of the energy to push CVS 1.4 out the door.
6143   
6144   Jim Kingdon implemented CVS 1.5's remote repository access features,
6145   fixed many bugs, and managed the release of version 1.5.
6146   
6147   Take a look at the README and the ChangeLog files in the CVS sources
6148   for more contributors.
6149   
6150   Last modified: _6/13/1997_
6151   
6152    2. You didn't write all of this FAQ, did you? 
6153    
6154   In the original hunt for questions to answer (performed in Jan/Feb,
6155   1993), I polled hundreds of people and I rephrased all sorts of text
6156   found on the net. Between 2/93 and 10/93, I released about 20
6157   versions, with corrections and additions from the info-cvs mailing
6158   list and private correspondence.
6159   
6160   Between 10/93 and 10/94 I extracted frequently asked questions from
6161   the 1200 mail messages to the info-cvs mailing list, turned them into
6162   focused questions and tried to answer them.
6163   
6164   93/02/?? ~4000 lines 93/06/?? ~5000 lines 93/10/23 7839 lines 278K
6165   94/10/29 9856 lines 360K 95/05/09 9981 lines 365K
6166   
6167   Because there are so many posers of questions, I will list only those
6168   who contribute answers or help significantly with the content and
6169   structure of this document.
6170   
6171   If I used someone else's text verbatim, I mentioned it in the given
6172   answer. The people whose email postings have added to this document or
6173   who have added to my understanding are:
6174   
6175   Brian Berliner <berliner@sun.com>, CVS maintainer. Paul Eggert
6176   <eggert@twinsun.com>, RCS maintainer.
6177   
6178   Gray Watson <gray@antaire.com> Per Cederqvist <ceder@signum.se> Pete
6179   Clark <pclark@is.com>
6180   
6181   all of whom have sent me copies of their tutorials and local CVS
6182   documentation.
6183   
6184   Additional contributors, who have sent me ideas, text, corrections and
6185   support include (in alphabetical order):
6186   
6187   Per Abrahamsen <amanda@iesd.auc.dk> Donald Amby
6188   <amby@mixcom.mixcom.com> Mark D Baushke <mdb@cisco.com> Jim Blandy
6189   <jimb@cyclic.com> Tom Cunningham <tomc@bouwsma,sps.mot.com> Graydon
6190   Dodson <grdodson@lexmark.com> Joe Drumgoole
6191   <joed@splatter.demon.co.uk> Don Dwiggins <dwig@markv.com> Bryant
6192   Eastham <bryant@ced.utah.edu> Dan Franklin <dan@diamond.bbn.com>
6193   Michael Ganzberger <ganzbergermd@ES.net> Steve Harris
6194   <vsh%etnibsd@uunet.uu.net> Erik van Linstee
6195   <linstee@dutecaj.et.tudelft.nl> Jeffrey M Loomis <jml@world.std.com>
6196   Barry Margolin <barmar@near.net> Mark K. Mellis <mkm@ncd.com> Chris
6197   Moore <Chris.Moore@src.bae.co.uk> Gary Oberbrunner <garyo@avs.com>
6198   Steve Turner <stevet@carrier.sps.mot.com> Dave Wolfe
6199   <dwolfe@pffft.sps.mot.com> Dale Woolridge <dwoolridge@cid.aes.doe.ca>
6200   
6201   Please send corrections. If I forgot you, remind me and I'll add your
6202   name to the list.
6203   
6204   Last modified: _6/13/1997_
6205   
6206  Category: /Past__Future_/Development/
6207  
6208   " + Development"
6209   
6210    1. Where do I send bug reports? 
6211    
6212   First make sure it is a bug. Talk to your friends, coworkers and
6213   anyone you know who uses CVS. Search this FAQ for related issues. Then
6214   test it carefully. Try out variations to narrow down the problem. Make
6215   sure it is repeatable. Look for workarounds so you can report them.
6216   
6217   If you are still sure it's a bug and you tried to fix it, skip to the
6218   next question. Otherwise, send a message to the info-cvs mailing list
6219   containing one of the following:
6220   
6221     If you have a good repeatable case and you think you know what is
6222   going on, then describe the problem in detail. Include a workaround if
6223   you have one.
6224   
6225     If you have no idea what is going on, go ahead and send a question
6226   to the info-cvs mailing list. Include any information you have
6227   describing the symptoms.
6228   
6229   Last modified: _6/13/1997_
6230   
6231    2. Where do I send fixes and patches? 
6232    
6233   First make sure the "fix" does something useful. Have someone review
6234   your fix. Spend a bit of one person's time in a detailed analysis of
6235   your vast idea before displaying a half-vast idea to hundreds of
6236   people.
6237   
6238   If you tried to fix it and the patch is small, include the patch in
6239   your message. Make sure the patch is based on the latest released
6240   version of CVS.
6241   
6242   If you tried to fix it and the patch is large, you should think about
6243   why it is so large. Did you add a generally useful feature, or did it
6244   grow out of hand?
6245   
6246   If you still believe it is solid, produce a patch file using the CVS
6247   commands "patch" or "diff -c". [[You *are* keeping CVS under CVS,
6248   right?]] The patch should be based on the latest released version of
6249   CVS. Then use the "cvsbug" program (provided with the CVS sources) to
6250   send it to the CVS maintainers. A self-contained patch that provides a
6251   single useful feature or correction might show up independently in the
6252   patches directory of the FTP archive.
6253   
6254   If careful testing reveals an RCS bug rather than a CVS bug, you can
6255   send bug reports to: rcs-bugs@cs.purdue.edu
6256   
6257   Last modified: _6/13/1997_
6258   
6259    3. Where do I send ideas for future development? 
6260    
6261   If you have a bright idea, discuss it on the info-cvs mailing list. If
6262   you have the time to implement something you can test, send the diffs
6263   along too as described above.
6264   
6265   Last modified: _6/13/1997_
6266   
6267    4. What plans are there for new features? 
6268    
6269
6270
6271A "rename" or "per-directory" database has been bandied about on
6272the net for years.  Many of the goals of the rename database have
6273been achieved by the so-called "death support" in recent versions of
6274CVS (such as 1.9).  For more information on what may remain to be
6275done, see item #189 in the TODO file of a development version of CVS.
6276
6277CVS version 1.5 supports remote repository access, but Paul
6278Kunz  has produced another version
6279(rCVS) that also runs remotely.  Note that as far as I know there
6280are no advantages to rCVS over the remote CVS in CVS 1.5 and later,
6281and the rCVS user community has migrated to remote CVS.
6282rCVS is *not* a multisite CVS (see item #186 in TODO for more on
6283multisite).  For more on rCVS, see
6284
6285ftp://ftp.slac.stanford.edu/software/rcvs
6286
6287kingdon@cyclic.com
6288
6289   Last modified: _9/6/1997_
6290   
6291    5. I have some time and I'd like to help. What can I do for you? 
6292    
6293
6294        You can review this document, correct errors and fill in any of
6295        the incomplete sections.
6296
6297        You can write scripts or CVS add-ons and make them available by
6298        web/FTP/etc.
6299
6300        You could work on the regression test suite (src/sanity.sh in the
6301        CVS source distribution).
6302
6303        You can write specs for new features, fix bugs, review the
6304        documentation or . . .
6305
6306        For more information, see the files HACKING and DEVEL-CVS in the
6307        CVS source distribution or
6308        http://www.cyclic.com/cyclic-pages/cvsdev.html
6309
6310        kingdon@cyclic.com
6311
6312   Last modified: _9/6/1997_
6313   
6314  Category: /Past__Future_/Professional_Support/
6315  
6316   " + Professional Support"
6317   
6318    1. Doesn't Cygnus support CVS? 
6319    
6320
6321
6322
6323        Cygnus is a company that supports free software such as the GCC
6324        compiler.  They have never sold support for CVS, however.  They
6325        do use CVS internally and have contributed much code to CVS over
6326        the years (for which CVS users should be grateful).
6327
6328        kingdon@cyclic.com
6329
6330   Last modified: _9/6/1997_
6331   
6332    2. What is Cyclic Software doing with CVS? 
6333    
6334
6335Cyclic Software exists to provide support for CVS.  For details such
6336as prices and what this covers, see http://www.cyclic.com or ask
6337info@cyclic.com.
6338
6339kingdon@cyclic.com
6340
6341   Last modified: _9/6/1997_
6342   
6343  Category: /User_Tasks_/
6344  
6345   " User Tasks "
6346   
6347  Category: /User_Tasks_/Common_User_Tasks/
6348  
6349   " + Common User Tasks"
6350   
6351    1. What is the absolute minimum I have to do to edit a file? 
6352    
6353   Tell your Repository Administrator to create a module covering the
6354   directory or files you care about. You will be told that your module
6355   name is <module>. Then type:
6356   
6357                cvs checkout <module>
6358                cd <module>
6359                emacs <file>          # Isn't Emacs a synonym for edit?
6360                cvs commit <file>
6361
6362   If you don't use modules (in my opinion, a mistake), you can check out
6363   a directory by substituting its relative path within the Repository
6364   for <module> in the example above.
6365   
6366   To work on a single file, you'll have to change "cd <module>" to "cd
6367   `dirname <module>`".
6368   
6369   Last modified: _6/13/1997_
6370   
6371    2. If I edit multiple files, must I type "commit" for each one? 
6372    
6373   No. You can commit a list of files and directories, including relative
6374   paths into multiple directories. You can also commit every modified
6375   file in the current directory or in all directories and subdirectories
6376   from your current directory downward. See 3D.2.
6377   
6378   Last modified: _6/13/1997_
6379   
6380    3. How do I get rid of the <module> directory that "checkout" created? 
6381    
6382   Change your directory to be the same as when you executed the
6383   "checkout" command that created <module>.
6384   
6385   If you want to get rid of the CVS control information, but leave the
6386   files and directories, type:
6387   
6388                cvs release <module>
6389
6390   If you want to obliterate the entire directory, type:
6391   
6392                cvs release -d <module>
6393
6394   ("release -d" searches through the output of "cvs -n update" and
6395   refuses to continue if the "update" command finds any modified files
6396   or non-ignored foreign files. Foreign directories too.)
6397   
6398   If you don't care about keeping "history", or checking for modified
6399   and foreign files, you can just remove the whole directory. That's "rm
6400   -rf <module>" under Unix.
6401   
6402   Last modified: _6/13/1997_
6403   
6404    4. How do I find out what has changed since my last update? 
6405    
6406   There are many ways to answer this.
6407   
6408   To find out what you've changed in your current working directory
6409   since your last checkout, update or commit, type:
6410   
6411                cvs diff
6412
6413   To find out what other people have added (to your branch) since you
6414   last checked out or updated, type:
6415   
6416                cvs diff -r BASE -r HEAD
6417
6418   To look at a revision history containing the comments for all changes,
6419   you can use the "log" command.
6420   
6421   You can also use "history" to trace a wide variety of events.
6422   
6423   Last modified: _6/13/1997_
6424   
6425    5. I just created a new file. How do I add it to the Repository? 
6426    
6427   The "update" command will mark files CVS doesn't know about in your
6428   working directory with a '?' indicator.
6429   
6430                ? <file>
6431
6432   To add <file> to the Repository, type:
6433   
6434                cvs add <file>
6435                cvs commit <file>
6436
6437   See 3A.[2-5] and 4C.8 for branch and merge considerations.
6438   
6439   Last modified: _6/13/1997_
6440   
6441    6. How do I merge changes made by others into my working directory? 
6442    
6443   If you are asking about other branches, see Section 4C on "Branching".
6444   You will have to use the "update -j" command.
6445   
6446   Retrieving changes made to the Repository on the *same* branch you are
6447   working on is the main purpose of the "update" command. The "update"
6448   command tries to merge work committed to the Repository by others
6449   since you last executed "checkout", "update" or "commit" into your
6450   working files.
6451   
6452   For a single file, there are six possible results when you type the
6453   "update" command:
6454   
6455     If the file is lying in your working directory, but is not under
6456   CVS, it will do nothing but print:
6457   
6458   ? <file>
6459   
6460     If neither you nor anyone else has committed changes to <file>,
6461   since your last "checkout", "update" or "commit", "update" will print
6462   nothing and do nothing.
6463   
6464     If you have made no changes to a working file, but you or others
6465   have committed changes to the Repository since your last "checkout",
6466   "update" or "commit" of this working file, CVS will remove your
6467   working file and replace it with a copy of the latest revision of that
6468   file in the Repository. It will print:
6469   
6470   U <file>
6471   
6472   You might want to examine the changes (using the CVS "diff" command)
6473   to see if they mesh with your own in related files.
6474   
6475     If you have made changes to a working file, but no one has changed
6476   your BASE revision (the revision you retrieved from the Repository in
6477   your last "checkout", "update" or "commit"), "update" will print:
6478   
6479   M <file>
6480   
6481   Nothing changes. You were told that you have a modified file in your
6482   directory.
6483   
6484     If you have made changes to your working file and you or others have
6485   committed changes to the Repository, but in different sections of the
6486   file, CVS will merge the changes stored in the Repository since your
6487   last "checkout", "update" or "commit" into your working file. "update"
6488   will print:
6489   
6490   RCS file: /Repository/module/<file> retrieving revision 1.X retrieving
6491   revision 1.Y Merging differences between 1.X and 1.Y into <file> M
6492   <file>
6493   
6494   If you execute "diff" before and after this step, you should see the
6495   same output, since both the base file and your working file changed in
6496   parallel. This is one of the few times the otherwise nonsensical
6497   phrase "same difference" means something.
6498   
6499     If both you and those who committed files (since your last checkout,
6500   update or commit) have made changes to the same section of a file, CVS
6501   will merge the changes into your file as in #5 above, but it will
6502   leave conflict indicators in the file. "update" will print:
6503   
6504   RCS file: /Repository/module/<file> retrieving revision 1.X retrieving
6505   revision 1.Y Merging differences between 1.X and 1.Y into <file>
6506   rcsmerge warning: overlaps during merge
6507                cvs update: conflicts found in <file>
6508                C <file>
6509
6510   This is a "conflict". The file will contain markers surrounding the
6511   overlapping text. The 'C' conflict indicator is sticky -- subsequent
6512   "update" commands will continue to show a 'C' until you edit the file.
6513   
6514   You must examine the overlaps with care and resolve the problem by
6515   analyzing how to retain the features of both changes. See 2D.7 and
6516   3P.6 for more details on conflict resolution.
6517   
6518   Last modified: _6/13/1997_
6519   
6520    7. How do I label a set of revisions so I can retrieve them later? 
6521    
6522   To "tag" the BASE revisions (the ones you last checked out, updated,
6523   or committed) you should "cd" to the head of the working directory you
6524   want to tag and type:
6525   
6526                cvs tag <tag>
6527
6528   It recursively walks through your working directory tagging the BASE
6529   revisions of all files.
6530   
6531   To "tag" the latest revision on the Main branch in the Repository, you
6532   can use the following from anywhere: (No "cd" is required -- it works
6533   directly on the Repository.)
6534   
6535                cvs rtag <tag> <module>
6536
6537   Last modified: _6/13/1997_
6538   
6539    8. How do I checkout an old release of a module, directory or file? 
6540    
6541   Module names and directories are simply ways to name sets of files.
6542   Once the names are determined, there are 6 ways to specify which
6543   revision of a particular file to check out:
6544   
6545     By tag or symbolic name, via the "-r <tag>" option.
6546   
6547     By date, via the "-D <date>" option.
6548   
6549     By branch tag (a type of tag with a magic format), via the "-r
6550   <branch_tag>" option.
6551   
6552     By date within a branch, via the "-r <branch_tag>:<date>" option.
6553   
6554     By an explicit branch revision number ("-r <rev>"), which refers to
6555   the latest revision on the branch. This isn't really an "old"
6556   revision, from the branch's perspective, but from the user's
6557   perspective the whole branch might have been abandoned in the past.
6558   
6559     An explicit revision number: "-r <rev>" Though this works, it is
6560   almost useless for more than one file.
6561   
6562   You type:
6563   
6564                cvs checkout <option-specified-above> <module>
6565                cd <module>
6566
6567   Last modified: _6/13/1997_
6568   
6569    9. What do I have to remember to do periodically? 
6570    
6571   You should execute "cvs -n update" fairly often to keep track of what
6572   you and others have changed. It won't change anything -- it will just
6573   give you a report.
6574   
6575   Unless you are purposely delaying the inclusion of others' work, you
6576   should execute "update" once in a while and resolve the conflicts. It
6577   is not good to get too far out of sync with the rest of the developers
6578   working on your branch.
6579   
6580   It is assumed that your system administrators have arranged for editor
6581   backup and Unix temp files (#* and .#*) to be deleted after a few
6582   weeks. But you might want to look around for anything else that is
6583   ignored or hidden. Try "cvs -n update -I !" to see all the ignored
6584   files.
6585   
6586   If you are the Repository Administrator, see 4B.16 on Administrator
6587   responsibilities.
6588   
6589   Last modified: _6/13/1997_
6590   
6591  Category: /User_Tasks_/General_Questions/
6592  
6593   " + General Questions"
6594   
6595    1. How do I see what CVS is trying to do? 
6596    
6597   The '-t' option on the main "cvs" command will display every external
6598   command (mostly RCS commands and file deletions) it executes. When
6599   combined with the '-n' option, which prevents the execution of any
6600   command that might modify a file, you can see what it will do before
6601   you let it fly. The '-t' option will *not* display every internal
6602   action, only calls to external programs.
6603   
6604   To see a harmless example, try typing:
6605   
6606                cvs -nt update
6607
6608   Some systems offer a "trace" or "truss" command that will display all
6609   system calls as they happen. This is a *very* low-level interface that
6610   does not normally follow the execution of external commands, but it
6611   can be useful.
6612   
6613   The most complete answer is to read the source, compile it with the
6614   '-g' option and step through it under a debugger.
6615   
6616   Last modified: _6/13/1997_
6617   
6618    2. If I work with multiple modules, should I check them all out and commit
6619    them occasionally? Is it OK to leave modules checked out? 
6620    
6621   The simple answers are "Yes."
6622   
6623   There is no reason to remove working directories, other than to save
6624   disk space. As long as you have committed the files you choose to make
6625   public, your working directory is just like any other directory.
6626   
6627   CVS doesn't care whether you leave modules checked out or not. The
6628   advantage of leaving them checked out is that you can quickly visit
6629   them to make and commit changes.
6630   
6631   Last modified: _6/13/1997_
6632   
6633    3. What is a "sticky" tag? What makes it sticky? How do I loosen it? 
6634    
6635   When you execute "update -r <tag>", CVS remembers the <tag>. It has
6636   become "sticky" in the sense that until you change it or remove it,
6637   the tag is remembered and used in references to the file as if you had
6638   typed "-r <tag>" on the command line.
6639   
6640   It is most useful for a <branch_tag>, which is a sticky tag indicating
6641   what branch you are working on.
6642   
6643   A revision number ("-r <rev-number>") or date ("-D <date>") can also
6644   become sticky when they are specified on the command line.
6645   
6646   A sticky tag, revision or date remains until you specify another tag,
6647   revision or date the same way. The "update -A" command moves back to
6648   the Main branch, which has the side-effect of clearing all sticky
6649   items on the updated files.
6650   
6651   The "checkout" command creates sticky tags, revisions and dates the
6652   same way "update" does.
6653   
6654   Also, the '-k' option records a "sticky" keyword option that is used
6655   in further "updates until "update -A" is specified.
6656   
6657   Last modified: _6/13/1997_
6658   
6659    4. How do I get an old revision without updating the "sticky tag"? 
6660    
6661   Use the '-p' option to "pipe" data to standard output. The command
6662   "update -p -r <tag/rev>" sends the selected revision to your standard
6663   output (usually the terminal, unless redirected). The '-p' affects no
6664   disk files, leaving a "sticky tag" unaltered and avoiding all other
6665   side-effects of a normal "update".
6666   
6667   If you want to save the result, you can redirect "stdout" to a file
6668   using your shell's redirection capability. In most shells the
6669   following command works:
6670   
6671            cvs update -p -r <tag/rev> filename > diskfile
6672
6673   Last modified: _6/13/1997_
6674   
6675    5. What operations disregard sticky tags? 
6676    
6677   The functions that routinely disregard sticky tags are:
6678   
6679     Those that work directly on the Repository or its administrative
6680   files:
6681   
6682                admin   rtag    log     status  remove  history
6683
6684     Those that take Tags or revisions as arguments and ignore everything
6685   else: (They also never *set* a sticky tag.)
6686   
6687                rdiff   import  export
6688
6689     The "release" command itself ignores sticky tags, but it calls "cvs
6690   -n update" (which *does* pay attention to a sticky tag) to figure out
6691   what inconsistencies exist in the working directory. If no
6692   discrepancies exist between the files you originally checked out
6693   (possibly marked by a sticky tag) and what is there now, "release -d"
6694   will delete them all.
6695   
6696     The "tag" command works on the revision lying in the working
6697   directory however it got there. That the revision lying there might
6698   happen to have a sticky tag attached to it is not the "tag" command's
6699   concern.
6700   
6701   The main function that *does* read and write sticky tags is the
6702   "update" command. You can avoid referring to or changing the sticky
6703   tag by using the '-p' option, which sends files to your terminal,
6704   touching nothing else.
6705   
6706   The "checkout" command sets sticky tags when checking out a new module
6707   and it acts like "update" when checking out a module into an existing
6708   directory.
6709   
6710   The "diff" and "commit" commands use the sticky tags, unless
6711   overridden on the command line. They do not set sticky tags. Note that
6712   you can only "commit" to a file checked out with a sticky tag, if the
6713   tag identifies a branch.
6714   
6715   There are really two types of sticky tags, one attached to individual
6716   files (in the ./CVS/Entries file) and one attached to each directory
6717   (in the ./CVS/Tag file). They can differ.
6718   
6719   The "add" command registers the desire to add a new file. If the
6720   "directory tag" (./CVS/Tag) file exists at the time of the "add", the
6721   value stored in ./CVS/Tag becomes the "sticky tag" on the new file.
6722   The file doesn't exist in the Repository until you "commit" it, but
6723   the ./CVS/Entries file holds the sticky tag name from the time of the
6724   "add" forward.
6725   
6726   Last modified: _6/13/1997_
6727   
6728    6. Is there a way to avoid reverting my Emacs buffer after committing a
6729    file? Is there a "cvs-mode" for Emacs? 
6730    
6731   See Section 4F.1
6732   
6733   Last modified: _6/13/1997_
6734   
6735    7. How does conflict resolution work? What *really* happens if two of us
6736    change the same file? 
6737    
6738   While editing files, there is no conflict. You are working on separate
6739   copies of the file stored in the virtual "branch" represented by your
6740   working directories. After one of you commits a file, the other may
6741   not commit the same file until "update" has merged the earlier
6742   committed changes into the later working file.
6743   
6744   For example, say you both check out rev 1.2 of <file> and make change
6745   to your working files. Your coworker commits revision 1.3. When you
6746   try to commit your file, CVS says:
6747   
6748                cvs commit: Up-to-date check failed for `<file>'
6749
6750   You must merge your coworker's changes into your working file by
6751   typing:
6752   
6753                cvs update <file>
6754
6755   which will produce the output described in 2B.6.
6756   
6757   If a conflict occurs, the filename will be shown with a status of 'C'.
6758   After you resolve any overlaps caused by the merging process, you may
6759   then commit the file. See 3P.6 for info on "sticky conflicts".
6760   
6761   Even if you get a simple 'M', you should examine the differences
6762   before committing the file. A smooth, error-free text merge is still
6763   no indication that the file is in proper shape. Compile and test it at
6764   least.
6765   
6766   The answer to two obvious questions is "Yes".
6767   
6768   Yes, the first one who commits avoids the merge. Later developers have
6769   to merge the earlier changes into their working files before
6770   committing the merged result. Depending on how difficult the merge is
6771   and how important the contending projects are, the order of commits
6772   and updates might have to be carefully staged.
6773   
6774   And yes, between the time you execute "update" and "commit" (while you
6775   are fixing conflicts and testing the results) someone else may commit
6776   another revision of <file>. You will have to execute "update" again to
6777   merge the new work before committing. Most organizations don't have
6778   this problem. If you do, you might consider splitting the file. Or
6779   hiring a manager.
6780   
6781   Last modified: _6/13/1997_
6782   
6783    8. How can I tell who has a module checked out? 
6784    
6785   If you "checkout" module names (not relative pathnames) and you use
6786   the release command, the "history" command will display active
6787   checkouts, who has them and where they were checked out. It is
6788   advisory only; it can be circumvented by using the '-l' option on the
6789   main "cvs" command.
6790   
6791   Last modified: _6/13/1997_
6792   
6793    9. Where did the .#<file>.1.3 file in my working directory come from? 
6794    
6795   It was created during an "update" when CVS merged changes from the
6796   Repository into your modified working file.
6797   
6798   It serves the same purpose as any "backup" file: saving your bacon
6799   often enough to be worth retaining. It is invaluable in recovering
6800   when things go wrong.
6801   
6802   Say Developers A (you) and B check out rev 1.3 of file <file>. You
6803   both make changes -- different changes. B commits first, so <file>,v
6804   in the Repository contains revisions up through 1.4.
6805   
6806   At this point, there are 5 (yes, five) versions of the file of
6807   interest to you:
6808   
6809     Revision 1.3 (What you originally checked out.)
6810   
6811     Revision 1.4 (What you need from developer B.)
6812   
6813     Your old working file. (Before the update.)
6814   
6815     Your new working file. (After the merge caused by "update".)
6816   
6817     Revision 1.5 (Which you will commit shortly.)
6818   
6819   In the case where your working file was not modified, #1 and #3 will
6820   be the same, as will #2 and #4. In this degenerate case, there is no
6821   need to create #5. The following assumes that your working file was
6822   modified.
6823   
6824   If the merge executed by the "update" caused no overlaps, and you
6825   commit the file immediately, #4 and #5 will be the same. But you can
6826   make arbitrary changes before committing, so the difference between #4
6827   and #5 might be more than just the correction of overlaps. In general,
6828   though, you don't need #4 after a commit.
6829   
6830   But #3 (which is the one saved as ".#<file>.1.3") holds all of your
6831   work, independent of B's work. It could represent a major effort that
6832   you couldn't afford to lose. If you don't save it somewhere, the merge
6833   makes #3 *disappear* under a potential blizzard of conflicts caused by
6834   overlapping changes.
6835   
6836   I have been saved a few times, and others I support have been saved
6837   hundreds of times, by the ability to "diff <original file> <original
6838   file with only my work added>", which can be done in the example above
6839   by the Unix shell command:
6840   
6841                cvs update -p -r 1.3 <file> | diff - .#<file>.1.3
6842
6843   The assumption is that the ".#" files will be useful far beyond the
6844   "commit" point, but not forever. You are expected to run the "normal"
6845   Unix cleanup script from "cron", which removes "#*" and ".#*" files
6846   older than a some period chosen by your sysadmin, usually ranging from
6847   7 to 30 days.
6848   
6849   A question was raised about the need for #3 after #5 has been
6850   committed, under the assumption that you won't commit files until
6851   everything is exactly as you like them.
6852   
6853   This assumes perfect humans, which violates one of the Cardinal rules
6854   of Software Engineering: Never assume any form of discipline on the
6855   part of the users of software. If restrictions are not bound into the
6856   software, then you, the toolsmith, have to arrange a recovery path.
6857   
6858   In other words, I've seen every possible variety of screwup you can
6859   imagine in #5. There is no way to make assumptions about what "should"
6860   happen. I've seen #5 filled with zeros because of NFS failures, I've
6861   seen emacs core dumps that leave #5 in an unreasonable state, I've
6862   seen a foolish developer uppercase the whole file (with his "undo"
6863   size set low so he couldn't undo it) and decide that it would be less
6864   work to play with the uppercased file than to blow it away and start
6865   over. I've even seen committed files with conflict markers still in
6866   them, a sure sign of carelessness.
6867   
6868   There are all sorts of scenarios where having #3 is incredibly useful.
6869   You can move it back into place and try again.
6870   
6871   Last modified: _6/13/1997_
6872   
6873    10. What is this "ignore" business? What is it ignoring? 
6874    
6875   The "update" and "import" commands use collections of Unix wildcards
6876   to skip over files and directories matching any of those patterns.
6877   
6878   You may add to the built-in ignore list by adding lines of
6879   whitespace-separated wildcards to the following places: (They are read
6880   in this order.)
6881   
6882     In a file named "cvsignore" in $CVSROOT/CVSROOT.
6883   
6884   A Repository Administrator uses this to add site-specific files and
6885   patterns to the built-in ignore list.
6886   
6887     In a file named ".cvsignore" in your home directory.
6888   
6889   For user-specific files. For example, if you use "__" as your default
6890   junk file prefix, you can put "__*" in your .cvsignore file.
6891   
6892   People who play around exclusively in directory trees where the
6893   Makefiles are generated by "imake" or "configure" might want to put
6894   "Makefile" in their ignore list, since they are all generated and
6895   usually don't end up in the Repository.
6896   
6897     In the CVSIGNORE environment variable.
6898   
6899   For session-specific files.
6900   
6901     Via the '-I' option on "import" or "update" commands.
6902   
6903   For this-command-only files.
6904   
6905     In a file named ".cvsignore" within each directory.
6906   
6907   The contents of a ".cvsignore" file in each directory is temporarily
6908   added to the ignore list. This way you can ignore files that are
6909   peculiar to that directory, such as executables and other generated
6910   files without known wildcard patterns.
6911   
6912   In any of the places listed above, a single '!' character nulls out
6913   the ignore list. A Repository administrator can use this to override,
6914   rather than enhance, the built-in ignore list. A user can choose to
6915   override the system-wide ignore list. For example, if you place "! *.o
6916   *.a" in your .cvsignore file, only *.o *.a files, plus any files a
6917   local-directory .cvsignore file, are ignored.
6918   
6919   A variant of the ignore-file scheme is used internally during
6920   checkout. "Module names" found in the modules file (or on the
6921   "checkout" command line) that begin with a '!' are ignored during
6922   checkout. This is useful to permanently ignore (if the '!' path is in
6923   the modules file) or temporarily ignore (if the '!' path is on the
6924   command line) a sub-directory within a Repository hierarchy. For
6925   example:
6926   
6927   cvs checkout !gnu/emacs/tests gnu/emacs
6928   
6929   would checkout the module (or relative path within $CVSROOT) named
6930   "gnu/emacs", but ignore the "tests" directory within it.
6931   
6932   Last modified: _6/13/1997_
6933   
6934    11. Is there a way to set user-specific configuration options? 
6935    
6936   User-specific configuration is available through use of a ".cvsrc"
6937   file in your home directory.
6938   
6939   CVS searches the first column of your ~/.cvsrc file for the cvs
6940   command name you invoked. If the command is found, the rest of the
6941   line is treated like a set of command line options, stuffed into the
6942   command line before the arguments you actually typed.
6943   
6944   For example, if you always want to see context diffs and you never
6945   want to have to delete a file before you run "cvs remove", then you
6946   should create a .cvsrc file containing the following:
6947   
6948                diff -c
6949                remove -f
6950
6951   which will add the given options to every invocation of the given
6952   commands.
6953   
6954   [[The rest of this will be removed someday, when CVS changes.]]
6955   
6956   I would like to stop here with a comment that the command name to use
6957   is the full, canonical one. But the command that the cvsrc support
6958   uses is the string you typed on the command line, not the proper
6959   command. So to get the full effect of the above example, you should
6960   also add all the alternate command names:
6961   
6962                di -c
6963                dif -c
6964                rm -f
6965                delete -f
6966
6967   There are two other limitations that will probably be fixed when CVS
6968   sprouts long option names:
6969   
6970     It only affects options made available on the command line.
6971   
6972   There is a limited number of short options. With long option names,
6973   there is no problem. You can have as many long options as you like,
6974   affecting anything that looks malleable.
6975   
6976     The existing command line options do not come in on/off pairs, so
6977   there is no easy way to override your ~/.cvsrc configuration for a
6978   single invocation of a command.
6979   
6980   Choosing a good set of long option pairs would fix this.
6981   
6982   Last modified: _6/13/1997_
6983   
6984    12. Is it safe to interrupt CVS using Control-C? 
6985    
6986   It depends on what you mean by "safe". ("Ah," said Arthur, "this is
6987   obviously some strange usage of the word *safe* that I wasn't
6988   previously aware of." -- Hitchhiker's Guide to the Galaxy)
6989   
6990   You won't hurt the underlying RCS files and if you are executing a
6991   command that only *reads* data, you will have no cleanup to do.
6992   
6993   But you may have to hit Control-C repeatedly to stop it. CVS uses the
6994   Unix "system" routine which blocks signals in the CVS parent process.
6995   A single Control-C during "system" will only halt the child process,
6996   usually some form of RCS command.
6997   
6998   If you don't hit another Control-C while the CVS process has control,
6999   it is likely to continue onto the next task assuming that the earlier
7000   one did its job. It is not enough to hit two Control-C's. You might
7001   simply kill two child processes and not interrupt CVS at all.
7002   Depending on the speed of your processor, your terminal and your
7003   fingers, you might have to hit dozens of Control-C's to stop the damn
7004   thing.
7005   
7006   Executing a CVS command, such as "commit" or "tag" that writes to the
7007   files is a different matter.
7008   
7009   Since CVS is not a full-fledged database, with what database people
7010   call "commit points", merely stopping the process will not back out
7011   the "transaction" and place you back in the starting blocks. CVS has
7012   no concept of an "atomic" transaction or of "backtracking", which
7013   means that a command can be half-executed.
7014   
7015   Hitting Control-C will usually leave lock files that you have to go
7016   clean up in the Repository.
7017   
7018   Example1:
7019   
7020                If you interrupt a multi-file "commit" in the middle of
7021                an RCS checkin, RCS will leave the file either fully
7022                checked-in or in its original state.  But CVS might have
7023                been half-way through the list of files to commit.  The
7024                directory or module will be inconsistent.
7025
7026                To recover, you must remove the lock files, then decide
7027                whether you want to back out or finish the job.
7028
7029                To back out, you'll have to apply the "admin -o"
7030                command, very carefully, to remove the newly committed
7031                revisions.  This is usually a bad idea, but is
7032                occasionally necessary.
7033
7034                To finish, you can simply retype the same commit command.
7035                CVS will figure out what files are still modified and
7036                commit them.  It helps that RCS doesn't leave a file in an
7037                intermediate state.
7038
7039   Example2:
7040   
7041                If you interrupt a multi-file "tag" command, you have a
7042                problem similar, but not equivalent, to interrupting a
7043                "commit".  The RCS file will still be consistent, but
7044                unlike "commit", which only *adds* to the RCS file, "tag"
7045                can *move* a tag and it doesn't keep a history of what
7046                revision a tag used to be attached to.
7047
7048                Normally, you have little choice but to re-execute the
7049                command and allow it to tag everything consistently.
7050
7051                You might be able to recover by carefully re-applying the
7052                tags via the "cvs admin -N" command, but you'll still have
7053                to dig up from outside sources the information you use to
7054                determine what tag was on what revision in what file.
7055                the Repository, or by using the equivalent: "cvs admin".
7056
7057   Halting a new "checkout" should cause no harm. If you don't want it,
7058   "release" (or rm -rf) it. If you do want it, re-execute the command. A
7059   repeated "checkout" from above a directory acts like a repeated
7060   "update -d" within it.
7061   
7062   Halting "update" half-way will give you an unpredictable collection of
7063   files and revisions. To continue, you can rerun the update and it
7064   should move you forward into in a known state. To back out, you'll
7065   have to examine the output from the first "update" command, take a
7066   look at each file that was modified and reconstruct the previous state
7067   by editing the ./CVS/Entries file and by using "cvs admin". Good Luck.
7068   
7069   Last modified: _6/13/1997_
7070   
7071    13. How do I turn off the "admin" command? 
7072    
7073   In the current revision, you'd have to edit the source code.
7074   
7075   Last modified: _6/13/1997_
7076   
7077    14. How do I turn off the ability to disable history via "cvs -l"? 
7078    
7079   In the current revision, you'd have to edit the source code.
7080   
7081   Last modified: _6/13/1997_
7082   
7083    15. How do I keep certain people from accessing certain directories? 
7084    
7085   If you don't try to run CVS set[ug]id, you can use Unix groups and
7086   permissions to limit access to the Repository.
7087   
7088   If you only want to limit "commit" commands, you can write a program
7089   to put in the "commitinfo" file. In the "contrib" directory, there are
7090   a few scripts that might help you out.
7091   
7092   Last modified: _6/13/1997_
7093   
7094  Category: /User_Tasks_/Getting_Started/
7095  
7096   " + Getting Started"
7097   
7098    1. What is the first thing I have to know? 
7099    
7100   Your organization has most likely assigned one or more persons to
7101   understand, baby-sit and administer the CVS programs and the data
7102   Repository. I call these persons Repository Administrators. They
7103   should have set up a Repository and "imported" files into it.
7104   
7105   If you don't believe anyone has this responsibility, or you are just
7106   testing CVS, then *you* are the Repository Administrator.
7107   
7108   If you are a normal user of CVS ask your Repository Administrator what
7109   module you should check out.
7110   
7111   Then you can work.
7112   
7113   If you *are* the Repository Administrator, you will want to read
7114   everything you can get your hands on, including this FAQ. Source
7115   control issues can be difficult, especially when you get to branches
7116   and release planning. Expect to feel stupid for a few days/weeks.
7117   
7118   No tool in the universe avoids the need for intelligent organization.
7119   In other words, there are all sorts of related issues you will
7120   probably have to learn. Don't expect to dive in without any
7121   preparation, stuff your 300 Megabytes of sources into CVS and expect
7122   to start working. If you don't prepare first, you will probably spend
7123   a few sleepless nights.
7124   
7125   Last modified: _6/13/1997_
7126   
7127    2. Where do I work? 
7128    
7129   Wherever you have disk space. That's one of the advantages of CVS: you
7130   use the "checkout" command to copy files from the Repository to your
7131   working directory, which can be anywhere you have the space.
7132   
7133   Your local group might have conventions for where to work. Ask your
7134   peers.
7135   
7136   Last modified: _6/13/1997_
7137   
7138    3. What does CVS use from my environment? 
7139    
7140   You must set two environment variables. Some shells share these
7141   variables with local shell variables using a different syntax. You'll
7142   have to learn how your shell handles them.
7143   
7144        Variable        Value (or action)
7145        ---------       ---------------------
7146        CVSROOT         Absolute pathname of the head of your Repository.
7147
7148        PATH            Normally set to a list of ':'-separated directory
7149                        pathnames searched to find executables.  You must
7150                        make sure "cvs" is in one of the directories.
7151
7152                        If your CVS was built with the RCSBIN directory set
7153                        to null (""), and you don't set the RCSBIN
7154                        variable mentioned below, then the RCS commands
7155                        also must be somewhere in your PATH.
7156
7157   Optional variables: (Used if set, but ignored otherwise.)
7158   
7159        Variable        Value (or action)
7160        ---------       ---------------------
7161        CVSEDITOR       The name of your favorite fast-start editor
7162                        program.  You'll be kicked into your editor to
7163                        supply revision comments if you don't specify them
7164                        via -m "Log message" on the command line.
7165
7166        EDITOR          Used if CVSEDITOR doesn't exist.  If EDITOR
7167                        doesn't exist, CVS uses a configured constant,
7168                        usually, "vi".
7169
7170        CVSREAD         Sets files to read-only on "checkout".
7171
7172        RCSBIN          Changes where CVS finds the RCS commands.
7173
7174        CVSIGNORE       Adds to the ignore list.  See Section 2D.
7175
7176   Other variables used by CVS that are normally set upon login:
7177   
7178        Variable        Value (or action)
7179        ---------       ---------------------
7180        LOGNAME         Used to find the real user name.
7181
7182        USER            Used to find the real user name if no LOGNAME.
7183
7184        HOME            Used to determine your home directory, if set.
7185                        Otherwise LOGNAME/USER/getuid() are used to find
7186                        your home directory from the passwd file.
7187
7188        TMPDIR          Used during import.  It might also be used if your
7189                        platform's version of mktemp(3) is unusual, or
7190                        you have changed the source to use tmpnam(3).
7191
7192   Last modified: _6/13/1997_
7193   
7194    4. OK, I've been told that CVS is set up, my module is named "ralph" and I
7195    have to start editing. What do I type? 
7196    
7197                cd <where you have some space to work>
7198                cvs checkout ralph
7199                cd ralph
7200
7201   And hack away.
7202   
7203   Last modified: _6/13/1997_
7204   
7205    5. I have been using RCS for a while. Can I convert to CVS without losing
7206    my revision history? How about converting from SCCS? 
7207    
7208   If you are asking such questions, you are not a mere user of CVS, but
7209   one of its Administrators! You should take a look at Section 4A,
7210   "Installing CVS" and Section 4B, "Setting up and Managing the
7211   Repository".
7212   
7213   Last modified: _6/13/1997_
7214   
7215  Category: /User_Tasks_/Less_Common_User_Tas/
7216  
7217   " + Less Common User Tasks"
7218   
7219    1. Can I create non-CVS sub-directories in my working directory? 
7220    
7221   Yes. Unless the directory exists in the Repository, "update" will skip
7222   over them and print a '?' the way it does for files you forgot to add.
7223   You can avoid seeing the '?' by adding the name of the foreign
7224   directory to the ./.cvsignore file, just ask you can do with files.
7225   
7226   If you explicitly mention a foreign directory on the "update" command
7227   line, it will traverse the directory and waste a bit of time, but if
7228   any directory or sub-directory lacks the ./CVS administrative
7229   directory, CVS will print an error and abort.
7230   
7231   Last modified: _6/13/1997_
7232   
7233    2. How do I add new sub-directories to the Repository? 
7234    
7235   The "add" command will work on directories. You type:
7236   
7237   mkdir <dir>
7238            cvs add <dir>
7239
7240   It will respond:
7241   
7242   Directory /Repos/<dir> added to the repository
7243   
7244   and will create both a matching directory in the Repository and a
7245   ./CVS administrative directory within the local <dir> directory.
7246   
7247   Last modified: _6/13/1997_
7248   
7249    3. How do I remove a file I don't need? 
7250    
7251   (See the questions in Section 4B on removing files from the
7252   Repository.)
7253   
7254   You type:
7255   
7256                rm <file>
7257                cvs remove <file>
7258
7259   CVS registers the file for removal. To complete the removal, you must
7260   type:
7261   
7262                cvs commit <file>
7263
7264   CVS moves the file to the Attic associated with your working
7265   directory. Each directory in the Repository stores its deleted files
7266   in an Attic sub-directory. A normal "checkout" doesn't look in the
7267   Attic, but if you specify a tag, a date or a revision, the "checkout"
7268   (or "update") command will retrieve files from the Attic with that
7269   tag, date or revision.
7270   
7271   Last modified: _6/13/1997_
7272   
7273    4. How do I rename a file? 
7274    
7275   CVS does not offer a way to rename a file in a way that CVS can track
7276   later. See Section 4B for more information.
7277   
7278   Here is the best (to some, the only acceptable) way to get the effect
7279   of renaming, while preserving the change log:
7280   
7281     Copy the RCS (",v") file directly in the Repository.
7282   
7283   cp $CVSROOT/<odir>/<ofile>,v $CVSROOT/<ndir>/<nfile>,v
7284   
7285   By duplicating the file, you will preserve the change history and the
7286   ability to retrieve earlier revisions of the old file via the "-r
7287   <tag/rev>" or "-D <date>" options to "checkout" and "update".
7288   
7289     Remove the old file using CVS.
7290   
7291   cd <working-dir>/<odir> rm <ofile>
7292                cvs remove <ofile>
7293                cvs commit <ofile>
7294
7295   This will move the <ofile> to the Attic associated with <odir>.
7296   
7297     Retrieve <nfile> and remove all the Tags from it.
7298   
7299   By stripping off all the old Tags, "checkout -r" and "update -r" won't
7300   retrieve revisions Tagged before the renaming.
7301   
7302   cd <working-dir>/<ndir>
7303                cvs update <nfile>
7304                cvs log <nfile>                 # Save the list of Tags
7305                cvs tag -d <tag1> <nfile>
7306                cvs tag -d <tag2> <nfile>
7307                . . .
7308
7309   This technique can be used to rename files within one directory or
7310   across different directories. You can apply this idea to directories
7311   too, as long as you apply the above to each file and don't delete the
7312   old directory.
7313   
7314   Of course, you have to change your build system (e.g. Makefile) in
7315   your <working-dir> to know about the name change.
7316   
7317   Warning: Stripping the old tags from the copied file will allow "-r
7318   <tag>" to do the right thing, but you will still have problems with
7319   "-D <date>" because there is no place to store the "deletion time".
7320   See 5B.3 for more details.
7321   
7322   Last modified: _6/13/1997_
7323   
7324    5. How do I make sure that all the files and directories in my working
7325    directory are really in the Repository? 
7326    
7327   A "cvs update", or "cvs -n update" (which won't modify your working
7328   directory) will display foreign elements, which have no counterpart in
7329   the Repository, preceded by a '?'. To register foreign directories,
7330   you can use "cvs add". To register foreign files, you can use "cvs
7331   add" followed by "cvs commit".
7332   
7333   You could also checkout your module, or the Repository directory
7334   associated with your working directory, a second time into another
7335   work area and compare it to your working directory using the (non-CVS)
7336   "diff -r" command.
7337   
7338   By default many patterns of files are ignored. If you create a file
7339   named "core" or a file ending in ".o", it is usually ignored. If you
7340   really want to see all the files that aren't in the Repository, you
7341   can use a special "ignore" pattern to say "ignore no files". Try
7342   executing: (You may have to quote or backwhack (i.e. precede by '\')
7343   the '!' in your shell.)
7344   
7345                cvs -n update -I !
7346
7347   The above command will display not only the normal modified, update
7348   and conflict indicators ('M', 'U', and 'C' respectively) on files
7349   within the Repository, but it will also display each file not in the
7350   Repository preceded by a '?' character.
7351   
7352   The '-n' option will not allow "update" to alter your working
7353   directory.
7354   
7355   Last modified: _6/13/1997_
7356   
7357    6. How do I create a branch? 
7358    
7359   Type this in your working directory:
7360   
7361                cvs tag -b <branch_tag>
7362
7363   and you will create a branch. No files have real branches in them yet,
7364   but if you move onto the branch by typing:
7365   
7366                cvs update -r <branch_tag>
7367
7368   and commit a file in the normal way:
7369   
7370                cvs commit <file>
7371
7372   then a branch will be created in the underlying <file>,v file and the
7373   new revision of <file> will appear only on that branch.
7374   
7375   See Section 4C, on Branching.
7376   
7377   Last modified: _6/13/1997_
7378   
7379    7. How do I modify the modules file? How about the other files in the
7380    CVSROOT administrative area? 
7381    
7382   A module named "modules" has been provided in the default modules
7383   file, so you can type:
7384   
7385                cvs checkout modules
7386                cd modules
7387
7388   Another module named CVSROOT has been provided in the default modules
7389   file, covering all the administrative files. Type:
7390   
7391                cvs checkout CVSROOT
7392                cd CVSROOT
7393
7394   Then you can edit your files, followed by:
7395   
7396                cvs commit
7397
7398   If you start with the provided template for the "modules" file, the
7399   CVSROOT and the "modules" module will have the "mkmodules" program as
7400   a "commit helper". After a file is committed to such a module,
7401   "mkmodules" will convert a number of standard files (See 4B.2) in the
7402   CVSROOT directory inside the Repository into a form that is usable by
7403   CVS.
7404   
7405   Last modified: _6/13/1997_
7406   
7407    8. How do I split a file into pieces, retaining revision histories? 
7408    
7409   If you and a coworker find yourselves repeatedly committing the same
7410   file, but never for changes in the same area of the file, you might
7411   want to split the file into two or more pieces. If you are both
7412   changing the same section of code, splitting the file is of no use.
7413   You should talk to each other instead.
7414   
7415   If you decide to split the file, here's a suggestion. In many ways, it
7416   is similar to multiple "renamings" as described in 2C.4 above.
7417   
7418   Say you want to split , which already in the Repository, into three
7419   pieces, , and .
7420   
7421     Copy the RCS (",v") files directly in the Repository, creating the
7422   new files, then bring readable copies of the new files into the
7423   working directory via "update".
7424   
7425   cp $CVSROOT//,v $CVSROOT//,v cp $CVSROOT//,v $CVSROOT//,v
7426                cvs update
7427
7428     Then remove all the from the new files, either using:
7429   
7430                cvs log               # Save the list of
7431                cvs tag -d
7432                cvs tag -d
7433                . . .
7434
7435   (eivind@freebsd.org) or using the following little script to
7436   autmatically remove the tags directly from the repository files:
7437
7438#!/bin/sh
7439for file in $*
7440do
7441        TAGS=`rlog $file | awk '/^symbolic names:/,/^keyword subst/' | awk 'BEG
7442IN {FS=":"} /^\t/ {print $1}'`
7443        echo The tags in $file are
7444        echo $TAGS
7445        echo Is it OK to remove these?
7446        read confirm
7447        if [ "$confirm" = "y" -o "$confirm" = "yes" ]
7448        then
7449                for tag in $TAGS
7450                do
7451                        echo Removing $file:$tag
7452                        rcs -n$tag $file
7453                done
7454        fi
7455done
7456
7457     Edit each file until it has the data you want in it. This is a
7458   hand-editing job, not something CVS can handle. Then commit all the
7459   files.
7460   
7461   [From experience, I'd suggest making sure that only one copy of each
7462   line of code exists among the three files, except for "include"
7463   statements, which must be duplicated. And make sure the code
7464   compiles.]
7465   
7466   emacs
7467                cvs commit
7468
7469   As in the "rename" case, by duplicating the files, you'll preserve the
7470   change history and the ability to retrieve earlier revisions.
7471   
7472   Of course, you have to alter your build system (e.g. Makefiles) to
7473   take the new names and the change in contents into account.
7474   
7475   Last modified: _3/11/1998_
7476   
7477  Category: /What_is_CVS_/
7478  
7479   " What is CVS? "
7480   
7481  Category: /What_is_CVS_/How_does_CVS_differ_/
7482  
7483   " + How does CVS differ from other, similar software?"
7484   
7485    1. How does CVS differ from RCS? 
7486    
7487   CVS uses RCS to do much of its work and absolutely all the work of
7488   changing the underlying RCS files in the Repository.
7489   
7490   RCS comprises a set of programs designed to keep track of changes to
7491   individual files. Of course, it also allows you to refer to multiple
7492   files on the command line, but they are handled by iterating over
7493   individual files. There is no pretense of coordinated interaction
7494   among groups of files.
7495   
7496   CVS's main intent is to provide a set of grouping functions that allow
7497   you to treat a collection of RCS files as a single object. Of course,
7498   CVS also has to do a lot of iteration, but it tries its best to hide
7499   that it is doing so. In addition, CVS has some truly group-oriented
7500   facets, such as the modules file and the CVS administrative files that
7501   refer to a whole directory or module.
7502   
7503   One group aspect that can be a bit confusing is that a CVS branch is
7504   not the same as an RCS branch. To support a CVS branch, CVS uses
7505   "tags" (what RCS calls "symbols") and some local state, in addition to
7506   RCS branches.
7507   
7508   Other features offered by CVS that are not supported directly by RCS
7509   are
7510   
7511     Automatic determination of the state of a file, (e.g. modified,
7512   up-to-date with the Repository, already tagged with the same string,
7513   etc.) which helps in limiting the amount of displayed text you have to
7514   wade through to figure out what changed and what to do next.
7515   
7516     A copy-modify-merge scheme that avoids locking the files and allows
7517   simultaneous development on a single file.
7518   
7519     Serialization of commits. CVS requires you to merge all changes
7520   committed (via "update") since you checked out your working copy of
7521   the file. Although it is still possible to commit a file filled with
7522   old data, it is less likely than when using raw RCS.
7523   
7524     Relatively easy merging of releases from external Vendors.
7525   
7526   Last modified: _6/13/1997_
7527   
7528    2. How does CVS differ from SCCS? 
7529    
7530   SCCS is much closer to RCS than to CVS, so some of the previous entry
7531   applies.
7532   
7533   You might want to take a look at Walter Tichy's papers on RCS, which
7534   are referred to in the RCS man pages.
7535   
7536   [[More info here?]]
7537   
7538   Last modified: _6/13/1997_
7539   
7540    3. How does CVS differ from ClearCase? 
7541    
7542   ClearCase is a distributed client-server version control system.
7543   ClearCase is a variant DSEE tools, formerly available on Apollo
7544   platforms. The ClearCase tool set includes a few X-based interface
7545   tools, a command-line interface, and C programmer API. It is currently
7546   available on Sun, HP, SGI and OSF/1 platforms.
7547   
7548   ClearCase uses a special Unix filesystem type, called "mvfs" for
7549   "multi-version file system". Conceptually, mvfs adds another dimension
7550   to a regular Unix filesystem. The new axis is used to store the
7551   different versions of files and to provide a tree-hierarchical view of
7552   a collection of objects that might be scattered across any number of
7553   separate hosts on your local network.
7554   
7555   Each user acquires a "view" into the file database by creating a
7556   special mvfs mount point on their machine. Each view has a
7557   "configuration spec" containing a set of selection rules that specify
7558   the particular version of each file to make visible in that view. You
7559   can think of a "view" as a work area in CVS, except that the files
7560   don't really exist on your local disk until you modify them. This
7561   technique conserves disk space because it doesn't keep private copies
7562   of read-only files.
7563   
7564   Another advantage is that a view is "transparent" in the sense that
7565   all of the files in a "view" appear to be regular Unix files to other
7566   tools and Unix system calls. An extended naming convention allows
7567   access to particular versions of a file directly:
7568   "test.cc@@/main/bugfix/3" identifies the third version of test.c on
7569   the bugfix branch.
7570   
7571   ClearCase supports both the copy-modify-merge model of CVS (by using
7572   what are called "unreserved checkouts" and the checkin/checkout
7573   development model with file locking. Directories are
7574   version-controlled objects as well as files. A graphical merge tool is
7575   provided. Like RCS, ClearCase supports branches, symbolic tags, and
7576   delta compression. ASCII as well as binary files are supported, and
7577   converters from RCS, SCCS, DSEE formats are also included.
7578   
7579   A make-compatible build facility is provided that can identify common
7580   object code and share it among developers. A build auditing feature
7581   automatically records file dependencies by tracking every file that is
7582   opened when producing a derived object, thus making explicit
7583   dependency lists unnecessary. Pre- and post-event triggers are
7584   available for most ClearCase operations to invoke user programs or
7585   shell scripts. User-defined attributes can be assigned to any version
7586   or object. Hyper-links between version controlled objects can record
7587   their relationship.
7588   
7589   For more information, contact:
7590   
7591   Atria Software, Inc. 24 Prime Park Way Natick, MA 01760 info@atria.com
7592   
7593   (508) 650-1193 (phone) (508) 650-1196 (fax)
7594   
7595                                Originally contributed by Steve Turner
7596                                Edited by the author of this FAQ.
7597
7598   Last modified: _6/13/1997_
7599   
7600    4. How does CVS differ from TeamWare/SparcWorks? 
7601    
7602   TeamWare is a configuration management tool from Sun Microsystems, a
7603   part of SparcWorks. It uses the same copy and merge model as CVS. The
7604   central abstraction is a workspace, which corresponds to either a CVS
7605   branch or a checked out module. TeamWare allows you to manipulate
7606   workspaces directly, including moving and merging code between
7607   workspaces. You can put your workspace on tape and continue to work
7608   with it at home, just like you can with CVS. TeamWare is built upon
7609   and compatible with SCCS.
7610   
7611   TeamWare provides both a command line interface and a graphical
7612   interface. The CodeManager tool will display the project as a tree of
7613   workspaces, and allows you to manipulate them with drag and drop. The
7614   other tools are VersionTool that displays and manipulates a dag with a
7615   version history of a single file, CheckPoint that will create symbolic
7616   tags, MakeTool, a make compatible tool with a GUI, and FileMerge which
7617   will interactively merge files when needed (like emerge for emacs). If
7618   you have a sun, you can try /usr/old/mergetool for an old SunView
7619   version of FileMerge.
7620   
7621   Email: sunprosig@sun.com
7622   
7623                                Originally extracted from TeamWare
7624                                Marketing literature by Per Abrahamsen.
7625                                Edited by the author of this FAQ.
7626
7627   For more information, contact:
7628   
7629   SunExpress, Inc. P.O. Box 4426 Bridgeton, MO 63044-9863 (800)873-7869
7630   
7631   Last modified: _6/13/1997_
7632   
7633    5. How does CVS differ from Aegis? 
7634    
7635   Aegis appears to be a policy-setting tool that allows you to use other
7636   sub-programs (make, RCS, etc.) to implement pieces of the imposed
7637   policy.
7638   
7639   The initial document seems to say that most Unix tools are inadequate
7640   for use under Aegis.
7641   
7642   It is not really similar to CVS and requires a different mindset.
7643   
7644   [[Need more info here.]]
7645   
7646   Last modified: _6/13/1997_
7647   
7648    6. How does CVS differ from Shapetools? 
7649    
7650   Shapetools includes a build mechanism (called Shape, not surprisingly)
7651   that is aware of the version mechanism, and some dependency tracking.
7652   It is based on a file system extension called Attributed File System,
7653   which allows arbitrary-sized "attributes" to be associated with a
7654   file. Files are version controlled in a manner similar to RCS.
7655   Configurations are managed through the Shapefile, an extension of the
7656   Makefile syntax and functionality. Shape includes version selection
7657   rules to allow sophisticated selection of component versions in a
7658   build.
7659   
7660   Shapetools' concurrency control is pessimistic, in contrast to that of
7661   CVS. Also, there's very limited support for branching and merging. It
7662   has a built-in policy for transitioning a system from initial
7663   development to production.
7664   
7665                                Contributed by Don Dwiggins
7666
7667   Last modified: _6/13/1997_
7668   
7669    7. How does CVS differ from TeamNet? 
7670    
7671   TeamNet is a configuration management tool from TeamOne.
7672   
7673   For more information, contact:
7674   
7675   TeamOne 710 Lakeway Drive, Ste 100 Sunnyvale, CA 94086 (800) 442-6650
7676   
7677                                Contributed by Steve Turner
7678
7679   Last modified: _6/13/1997_
7680   
7681    8. How does CVS differ from ProFrame? 
7682    
7683   ProFrame is a new system integration framework from IBM. ProFrame is
7684   compliant with the CFI (CAD Framework Initiative) industry standards,
7685   including the Scheme extension language.
7686   
7687   ProFrame consists of three major components: (1) the Process Manager
7688   that automates your local design methodology (2) the Design Data
7689   Manager handles configuration management, and (3) Inter-tool
7690   Communication to provide a communication path among tools running on
7691   heterogeneous servers.
7692   
7693   The Design Data Manager(2) is probably the appropriate component to
7694   compare to CVS. The Design Data Manager provides version control with
7695   checkin/checkout capability, configuration management, and data
7696   dependency tracking. A graphical data selection interface is provided.
7697   Using this interface, you may create and manipulate objects and
7698   hierarchy structures, view the revision history for an object, and
7699   view and assign attributes to a design object.
7700   
7701   The ProFrame server currently runs only on RS6000, but clients may be
7702   a wide variety of Unix platforms. Contact IBM for the latest platform
7703   information.
7704   
7705   For more information, contact:
7706   
7707   IBM EDA Marketing and Sales P.O. Box 950, M/S P121 Poughkeepsie, NY
7708   12602 (800) 332-0066
7709   
7710                                Contributed by Steve Turner
7711                        [extracted from the ProFrame 1.1.0 datasheet]
7712
7713   Last modified: _6/13/1997_
7714   
7715    9. How does CVS differ from CaseWare/CM? 
7716    
7717   CaseWare/CM is a software configuration management product from
7718   CaseWare, Inc. CaseWare/CM may be customized to support a wide variety
7719   of methodologies, including various phases of the software lifecycle,
7720   and different access rights for users.
7721   
7722   A GUI is provided to view version histories and configurations. A
7723   merge tools is also included. CaseWare supports type-specific
7724   lifecycles, which allows different types of files to move through
7725   different lifecycles. Also provided is a build facility to support
7726   automatic dependency analysis, parallel, distributed, and remote
7727   builds, and variant releases.
7728   
7729   CaseWare/CM has been integrated with other CASE tools, including
7730   FrameMaker, ALSYS Ada, CodeCenter/Object Center, HP SoftBench, and
7731   Software Through Pictures. CaseWare also offers CaseWare/PT, a problem
7732   tracking system to integrate change requests with configuration
7733   management.
7734   
7735   Multiple vendors and operating systems are supported.
7736   
7737   For more information, contact:
7738   
7739   CaseWare, Inc. 108 Pacifica, 2nd Floor Irvine, CA 92718-3332 (714)
7740   453-2200 (phone) (714) 453-2276 (fax)
7741   
7742                                Contributed by Steve Turner
7743                        [extracted from the CaseWare/CM data sheet]
7744
7745   Last modified: _6/13/1997_
7746   
7747    10. How does CVS differ from SABLIME? 
7748    
7749   Produced by AT&T. Sablime uses SCCS as the underlying source code
7750   control system. It uses some other control system (called sbcs I
7751   think) for managing binary files. It uses lock, edit, comit, unlock
7752   mechanism. It has a motif based GUI and curses based GUI (that works
7753   only with ksh, not tcsh, or bash) to do more common tasks. It has even
7754   a command line interface.
7755   
7756   Changing source happens as a result of MR. A testing person or a
7757   developer assigns an MR (modification request) to a group of people.
7758   They are allowed to take out files under that MR and change them and
7759   check them back in. You can set up dependencies between and MR and do
7760   release management to say "I want the sources to include these MRs"
7761   etc. It is a reasonably good maintanance system. It is bit heavy
7762   weight though, and the interface is not too polished and does not work
7763   on windows (though that may have changed). rama@savera.com
7764   
7765   Last modified: _7/30/1998_
7766   
7767    11. How does CVS differ from PVCS? 
7768    
7769   PVCS works on single files like RCS and SCCS, CVS works on complete
7770   subsystems. PVCS has a make utility (called a configuration builder),
7771   CVS does not. PVCS has a GUI interface for Unix, DOS, OS/2, and MS
7772   Windows.
7773   
7774                Intersolv, Inc.
7775                1700 NW 167th Place
7776                OR 97006
7777
7778                                Contributed by Per Abrahamsen
7779                        [Extracted from Intersolv Marketing literature.]
7780
7781   Last modified: _6/13/1997_
7782   
7783    12. How does CVS differ from CMVC? 
7784    
7785   CMVC is an IBM Configuration Management and Version Control system.
7786   (Though I'm not certain that's the right acronym expansion.) It runs
7787   on Suns, HPs, RS6000s, OS/2 and Windows.
7788   
7789   Other than revision control, it apparently has features to manage
7790   releases, bug tracking and the connection between alterations and
7791   reported bugs and feature requests. It is a client/server system,
7792   based on a choice of commercial Relational Database systems, and it
7793   provides a Motif or command line interface.
7794   
7795   Unlike CVS, it uses a strict locking protocol to serialize source code
7796   alterations.
7797   
7798   Last modified: _6/13/1997_
7799   
7800  Category: /What_is_CVS_/What_do_you_mean_by_/
7801  
7802   " + What do you mean by . . .? (Definitions)"
7803   
7804    1. What are "The Repository", "$CVSROOT" and "CVSROOT"? 
7805    
7806   The Repository is a directory tree containing the CVS administrative
7807   files and all the RCS files that constitute "imported" or "committed"
7808   work. The Repository is kept in a shared area, separate from the
7809   working areas of all developers.
7810   
7811   Users of CVS must set their "CVSROOT" environment variable to the
7812   absolute pathname of the head of the Repository. Most command line
7813   interpreters replace an instance of "$CVSROOT" with the value of the
7814   "CVSROOT" environment variable. By analogy, in this document
7815   "$CVSROOT" is used as shorthand for "the absolute pathname of the
7816   directory at the head of the Repository".
7817   
7818   One of the things found in $CVSROOT is a directory named CVSROOT. It
7819   contains all the "state", the administrative files, that CVS needs
7820   during execution. The "modules", "history", "commitinfo", "loginfo"
7821   and other files can be found there. See 4B.2 for more information
7822   about CVSROOT files.
7823   
7824   Last modified: _6/13/1997_
7825   
7826    2. What is an RCS file? 
7827    
7828   An RCS file is a text file containing the source text and the revision
7829   history for all committed revisions of a source file. It is stored
7830   separately from the working files, in a directory hierarchy, called
7831   the Repository.
7832   
7833   RCS is the "Revision Control System" that CVS uses to manage
7834   individual files. RCS file names normally end in ",v", but that can be
7835   altered (via the RCS -x option) to conform to file naming standards on
7836   platforms with unusual filename limitations.
7837   
7838   Last modified: _6/13/1997_
7839   
7840    3. What is a working file? 
7841    
7842   A working file is a disk file containing a checked-out copy of a
7843   source file that earlier had been placed under CVS. If the working
7844   file has been edited, the changes since the last committed revision
7845   are invisible to other users of CVS.
7846   
7847   Last modified: _6/13/1997_
7848   
7849    4. What is a working directory (or working area)? 
7850    
7851   A working directory is the place where you work and the place from
7852   which you "commit" files.
7853   
7854   The "checkout" command creates a tree of working directories, filling
7855   them with working files. Each working directory contains a
7856   sub-directory named ./CVS containing three administrative files, which
7857   are created by "checkout" and are always present:
7858   
7859   ./CVS/Entries
7860                contains information about working files.
7861
7862   ./CVS/Repository
7863                contains the location of the directory within the
7864                Repository that was used to create the working directory.
7865
7866   ./CVS/Root
7867                contains the value of $CVSROOT at the time you created
7868                the working directory.
7869
7870   Other files may also appear in ./CVS depending on the state of your
7871   working directory:
7872   
7873   ./CVS/Tag
7874                contains the "sticky tag" associated with the whole
7875                directory.  See 3A.2 for its main purpose.
7876                [Created by "checkout" or "update" when using "-r <tag>".]
7877                [Deleted by "checkout" or "update" when using '-A'.]
7878
7879   ./CVS/Entries.Static
7880                contains a fixed list of working files.  If this file
7881                exists, an "update" doesn't automatically bring newly
7882                added files out of the Repository.
7883                [Created and maintained by hand.]
7884
7885   ./CVS/Checkin.prog
7886                contains a program to run whenever anything in the
7887                working directory is committed.
7888                [Created by checkout if "-i <prog>" appears in the
7889                 modules file for the checked-out module.]
7890
7891   ./CVS/Update.prog
7892                contains a program to run whenever anything in the
7893                working directory is updated.
7894                [Created by checkout if "-u <prog>" appears in the
7895                 modules file for the checked-out module.]
7896
7897   ./CVS/<file>,p ./CVS/<file>,t
7898                contain (possibly zero-length) state information about an
7899                "add" that has not been committed.
7900                [Created by "add".]
7901                [Deleted by "commit" or "remove".]
7902
7903   Last modified: _6/13/1997_
7904   
7905    5. What is "checking out"? 
7906    
7907   "Checking out" is the act of using the "checkout" command to copy a
7908   particular revision from a set of RCS files into your working area.
7909   You normally execute "checkout" only once per working directory (or
7910   tree of working directories), maintaining them thereafter with the
7911   "update" command.
7912   
7913   See section 3C on the "checkout" command.
7914   
7915   Last modified: _6/13/1997_
7916   
7917    6. What is a revision? 
7918    
7919   A "revision" is a version of a file that was "committed" ("checked
7920   in", in RCS terms) some time in the past. CVS (and RCS) can retrieve
7921   any file that was committed by specifying its revision number or its
7922   "tag" ("symbolic name", in RCS terms).
7923   
7924   In CVS, a "tag" is more useful than a revision number. It usually
7925   marks a milestone in development represented by different revision
7926   numbers in different files, all available as one "tagged" collection.
7927   
7928   Sometimes the word "revision" is used as shorthand for "the file you
7929   get if you retrieve (via "checkout" or "update") the given revision
7930   from the Repository."
7931   
7932   Last modified: _6/13/1997_
7933   
7934    7. What is a "Tag"? 
7935    
7936   A "Tag" is a symbolic name, a synonym or alias for a particular
7937   revision number in a file. The CVS "tag" command places the same "Tag"
7938   on all files in a working directory, allowing you to retrieve those
7939   files by name in the future.
7940   
7941   The CVS "Tag" is implemented by applying RCS "symbols" to each
7942   individual file. The Tags on a file (or collection of files) may be
7943   displayed using the "log" command.
7944   
7945   Last modified: _6/13/1997_
7946   
7947    8. What are "HEAD" and "BASE"? 
7948    
7949   HEAD and BASE are built-in tags that don't show up in the "log" or
7950   "status" listings. They are interpreted directly by CVS.
7951   
7952   "HEAD" refers to the latest revision on the current branch in the
7953   Repository. The current branch is either the main line of development,
7954   or a branch in development created by placing a branch tag on a set of
7955   files and checking out that branch.
7956   
7957   "BASE" refers to the revision on the current branch you last checked
7958   out, updated, or committed. If you have not modified your working
7959   file, "BASE" is the committed revision matching it.
7960   
7961   Most of the time BASE and HEAD refer to the same revision. They can
7962   become different in two ways:
7963   
7964     Someone else changed HEAD by committing a new revision of your file
7965   to the Repository. You can pull BASE up to equal HEAD by executing
7966   "update".
7967   
7968     You moved BASE backward by executing "checkout" or "update" with the
7969   option "-r <rev/tag>" or "-D <date>". CVS records a sticky tag and
7970   moves your files to the specified earlier revision. You can clear the
7971   sticky tag and pull BASE up to equal HEAD again by executing "update
7972   -A".
7973   
7974   Last modified: _6/13/1997_
7975   
7976    9. What is a Branch? 
7977    
7978   In general, a branch is any mechanism that allows one or more
7979   developers to modify a file without affecting anyone other than those
7980   working on the same branch.
7981   
7982   There are four kinds of "branch" CVS can manage:
7983   
7984     The Vendor Branch.
7985   
7986   A single vendor branch is supported. The "import" command takes a
7987   sequence of releases from a source code vendor (called a "vendor" even
7988   if no money is involved), placing them on a special "Vendor" branch.
7989   The Vendor branch is considered part of the "Main line" of
7990   development, though it must be merged into locally modified files on
7991   the RCS Main branch before the "import" is complete.
7992   
7993   See Section 3H ("import").
7994   
7995     Your Working directory.
7996   
7997   A checked-out working directory, can be treated like a private branch.
7998   No one but you can touch your files. You have complete control over
7999   when you include work committed by others. However, you can't commit
8000   or tag intermediate versions of your work.
8001   
8002     A Development branch.
8003   
8004   A group of developers can share changes among the group, without
8005   affecting the Main line of development, by creating a branch. Only
8006   those who have checked-out the branch see the changes committed to
8007   that branch. This kind of branch is usually temporary, collapsing
8008   (i.e. merge and forget) into the Main line when the project requiring
8009   the branch is completed.
8010   
8011   You can also create a private branch of this type, allowing an
8012   individual to commit (and tag) intermediate revisions without changing
8013   the Main line. It should be managed exactly like a Development Branch
8014   -- collapsed into the Main line (or its parent branch, if that is not
8015   the Main Branch) and forgotten when the work is done.
8016   
8017     A Release branch.
8018   
8019   At release time, a branch should be created marking what was released.
8020   Later, small changes (sometimes called "patches") can be made to the
8021   release without including everything else on the Main line of
8022   development. You avoid forcing the customer to accept new, possibly
8023   untested, features added since the release. This is also the way to
8024   correct bugs found during testing in an environment where other
8025   developers have continued to commit to the Main line while you are
8026   testing and packaging the release.
8027   
8028   Although the internal format of this type of branch (branch tag and
8029   RCS branches) is the same as in a development branch, its purpose and
8030   the way it is managed are different. The major difference is that a
8031   Release branch is normally Permanent. Once you let a release out the
8032   door to customers, or to the next stage of whatever process you are
8033   using, you should retain forever the branch marking that release.
8034   
8035   Since the branch is permanent, you cannot incorporate the branch fixes
8036   into the Main line by "collapsing" (merging and forgetting) the
8037   release branch. For large changes to many files on the release branch,
8038   you will have to perform a branch merge using "update -j <rev> -j
8039   <rev>". (See 4C.7)
8040   
8041   The most common way to merge small changes back into Main line
8042   development is to make the change in both places simultaneously. This
8043   is faster than trying to perform a selective merge.
8044   
8045   See 1D.12 (merges) and Section 4C, on Branching for more info.
8046   
8047   Last modified: _6/13/1997_
8048   
8049    10. What is "the trunk"? 
8050    
8051   Another name for the RCS Main Branch. The RCS Main Branch is related,
8052   but not equivalent, to both the CVS Main branch and what developers
8053   consider to be the Main line of development. See 3H.3 and Section 4C
8054   on Branching.
8055   
8056   Last modified: _6/13/1997_
8057   
8058    11. What is a module? 
8059    
8060   In essence, a module is a name you hand to the "checkout" command to
8061   retrieve one or more files to work on. It was originally intended to
8062   be a simple, unique name in the "modules" file attached to a directory
8063   or a subset of files within a directory.
8064   
8065   The module idea is now a somewhat slippery concept that can be defined
8066   in two different ways:
8067     * A module is an argument to "checkout". There are three types:
8068         1. An entry in the modules file. A "module" name as described in
8069            'B.' below.
8070         2. A relative path to a directory or file in the Repository.
8071         3. A mixed-mode string of "modulename/relative-path". Everything
8072            up to the first slash ('/') is looked up as a module. The
8073            relative path is appended to the directory associated with
8074            the module name and the resulting path is checked out as in
8075            #2 above.
8076     * A module is a unique (within the file) character string in the
8077       first column of the modules file. There are five types:
8078         1. A name for a directory within the Repository that allows you
8079            to ignore the parent directories above it.
8080            Example:
8081                  emacs  gnu/emacs
8082         2. A name for a subset of the files within such a directory.
8083            Example:
8084                  ls    unix/bin Makefile ls.c
8085            The 2nd through Nth strings in the above can be files,
8086            directories or module substitutions. No relative paths.
8087            A module substitution occurs when you use a '&module-name'
8088            reference. The module-name referred to is logically
8089            substituted for the '&module-name' string.
8090         3. A relative pathname to a directory within the Repository
8091            which, when checked out, creates an image of part of the
8092            Repository structure in your current directory.
8093            Example:
8094            gnu/emacs -o /bin/emacs.helper gnu/emacs
8095            The files checked out are exactly the same as the files
8096            "checkout" would retrieve if the path weren't even in the
8097            modules file. The only reason to put this kind of relative
8098            pathname into the modules file is to hook one of the helper
8099            functions onto it.
8100         4. A relative pathname to a single file within the Repository
8101            which, when checked out, creates something you probably don't
8102            want: It creates a directory by the name of the file and puts
8103            the file in it.
8104            Example:
8105            gnu/emacs/Makefile -o /bin/emacs.helper gnu/emacs Makefile
8106            The file checked out is the same as what you would get if you
8107            handed the relative pathname to the "checkout" command. But
8108            it puts it in a strange place. The only reason to do this is
8109            to hook a helper function onto a specific file name.
8110         5. An alias consisting of a list of any of the above, including
8111            other aliases, plus exceptions.
8112            Example:
8113            my_work -a emacs !emacs/tests gnu/bison unix/bin/ls.c
8114            The exception "!emacs/test" above is functionally equivalent
8115            to specifying "!emacs/tests" on the "checkout" command line.
8116       
8117   Another way to look at it is that the modules file is simply another
8118   way to "name" files. The hierarchical directory structure provides
8119   another. You should use whatever turns out to be simplest for your
8120   development group.
8121   
8122   See 4G.2 for some specific ideas about how to use the modules file.
8123   
8124   Last modified: _11/12/1997_
8125   
8126    12. What does "merge" mean? 
8127    
8128   A merge is a way of combining changes made in two independent copies
8129   of a common starting file. Checking out an RCS revision produces a
8130   file, so for the purposes of a merge "file" and "revision" are
8131   equivalent. So, we can say there are always three "files" involved in
8132   a merge:
8133   
8134     The original, starting, "base" or "branch point" file.
8135   
8136     A copy of the base file modified in one way.
8137   
8138     Another copy of the base file modified in a different way.
8139   
8140   Humans aren't very good at handling three things at once, so the
8141   terminology dealing with merges can become strained. One way to think
8142   about it is that all merges are performed by inserting the difference
8143   between a base revision and a later revision (committed by someone
8144   else) into your working file. Both the "later" revision and your
8145   working file are presumed to have started life as a copy of the "base"
8146   revision.
8147   
8148   In CVS, there are three main types of "merge":
8149   
8150     The "update" command automatically merges revisions committed by
8151   others into your working file. In this case, the three files involved
8152   in the merge are:
8153   
8154   Base: The revision you originally checked out. Later: A revision
8155   committed onto the current branch after you checked out the Base
8156   revision. Working: Your working file. The one lying in the working
8157   directory containing changes you have made.
8158   
8159     The "update -j <branch_tag> {optional files}" command merges changes
8160   made on the given branch into your working files, which is presumed to
8161   be on the Main line of development.
8162   
8163   See 4C.6
8164   
8165     The "update -j <rev> -j <rev> {optional files}" command merges the
8166   difference between two specified revisions into files in your working
8167   directory. The two revisions <rev> are usually on the same branch and,
8168   when updating multiple files, they are most useful when they are Tag
8169   names rather than numeric revisions.
8170   
8171   See 4C.7
8172   
8173   Last modified: _6/13/1997_
8174   
8175  Category: /What_is_CVS_/What_is_CVS_Whats_it/
8176  
8177   " + What is CVS? What's it for? Why CVS?"
8178   
8179    1. What does CVS stand for? Can you describe it in one sentence? 
8180    
8181   "CVS" is an acronym for the "Concurrent Versions System".
8182   
8183   CVS is a "Source Control" or "Revision Control" tool designed to keep
8184   track of source changes made by groups of developers working on the
8185   same files, allowing them to stay in sync with each other as each
8186   individual chooses.
8187   
8188   Last modified: _6/13/1997_
8189   
8190    2. What is CVS for? What does it do for me? 
8191    
8192   CVS is used to keep track of collections of files in a shared
8193   directory called "The Repository". Each collection of files can be
8194   given a "module" name, which is used to "checkout" that collection.
8195   
8196   After checkout, files can be modified (using your favorite editor),
8197   "committed" back into the Repository and compared against earlier
8198   revisions. Collections of files can be "tagged" with a symbolic name
8199   for later retrieval.
8200   
8201   You can add new files, remove files you no longer want, ask for
8202   information about sets of files in three different ways, produce patch
8203   "diffs" from a base revision and merge the committed changes of other
8204   developers into your working files.
8205   
8206   Last modified: _6/13/1997_
8207   
8208    3. How does CVS work? 
8209    
8210   CVS saves its version-control information in RCS files stored in a
8211   directory hierarchy, called the Repository, which is separate from the
8212   user's working directory.
8213   
8214   Files in the Repository are stored in a format dictated by the RCS
8215   commands CVS uses to do much of its real work. RCS files are standard
8216   byte-stream files with an internal format described by keywords stored
8217   in the files themselves.
8218   
8219   To begin work, you execute a "checkout" command, handing it a module
8220   name or directory path (relative to the $CVSROOT variable) you want to
8221   work on. CVS copies the latest revision of each file in the specified
8222   module or directory out of the Repository and into a directory tree
8223   created in your current directory. You may specify a particular branch
8224   to work on by symbolic name if you don't want to work on the default
8225   (main or trunk) branch.
8226   
8227   You may then modify files in the new directory tree, build them into
8228   output files and test the results. When you want to make your changes
8229   available to other developers, you "commit" them back into the
8230   Repository.
8231   
8232   Other developers can check out the same files at the same time. To
8233   merge the committed work of others into your working files you use the
8234   "update" command. When your merged files build and test correctly, you
8235   may commit the merged result. This method is referred to as
8236   "copy-modify-merge", which does not require locks on the source files.
8237   
8238   At any time, usually at some milestone, you can "tag" the committed
8239   files, producing a symbolic name that can be handed to a future
8240   "checkout" command. A special form of "tag" produces a branch in
8241   development, as usually happens at "release" time.
8242   
8243   When you no longer plan to modify or refer to your local copy of the
8244   files, they can be removed.
8245   
8246   Last modified: _6/13/1997_
8247   
8248    4. What is CVS useful for? 
8249    
8250   CVS is intended to handle source control for files in three major
8251   situations:
8252   
8253     Multiple developers working on the same files.
8254   
8255   The major advantage of using CVS over the simpler tools like RCS or
8256   SCCS is that it allows multiple developers to work on the same sources
8257   at the same time.
8258   
8259   The shared Repository provides a rendezvous for committed sources that
8260   allows developers a fair amount of flexibility in how often to publish
8261   (via the "commit" command) changes or include work committed by others
8262   (via the "update" command).
8263   
8264     Tracking a stream of releases from a source vendor.
8265   
8266   If you are making changes to sources distributed by someone else, the
8267   CVS feature, called the Vendor Branch, allows you to combine local
8268   modifications with repeated vendor releases.
8269   
8270   I have found this most useful when dealing with sources from three
8271   major classes of source vendor:
8272   
8273     Large companies who send you tapes full of the latest release (e.g.
8274   Unix OS vendors, database companies).
8275   
8276     Public Domain software which *always* requires work.
8277   
8278     Pseudo-Public sources which may require work. (e.g. GNU programs, X,
8279   CVS itself, etc.)
8280   
8281     Branching development.
8282   
8283   Aside from the "Vendor Branch", there are three kinds of "branches in
8284   development" that CVS can support:
8285   
8286     Your working directory can be treated as a private branch.
8287   
8288     A Development branch can be shared by one or more developers.
8289   
8290     At release time, a branch is usually created for bug fixes.
8291   
8292   (See 1D.9 and Section 4C for more info on branches.)
8293   
8294   CVS's branch support is a bit primitive, but it was designed to allow
8295   you to create branches, work on them for while and merge them back
8296   into the main line of development. You should also be able to merge
8297   work performed on the main branch into the branch you are working on.
8298   Arbitrary sharing and merging between branches is not currently
8299   supported.
8300   
8301   Last modified: _6/13/1997_
8302   
8303    5. What is CVS *not* useful for? 
8304    
8305   CVS is not a build system.
8306   
8307   Though the structure of your Repository and modules file interact with
8308   your build system (e.g. a tree of Makefiles), they are essentially
8309   independent.
8310   
8311   CVS does not dictate how you build anything. It merely stores files
8312   for retrieval in a tree structure you devise.
8313   
8314   CVS does not dictate how to use disk space in the checked out working
8315   directories. If you require your Makefiles or build procedures to know
8316   the relative positions of everything else, you wind up requiring the
8317   entire Repository to be checked out. That's simply bad planning.
8318   
8319   If you modularize your work, and construct a build system that will
8320   share files (via links, mounts, VPATH in Makefiles, etc.), you can
8321   arrange your disk usage however you like.
8322   
8323   But you have to remember that *any* such system is a lot of work to
8324   construct and maintain. CVS does not address the issues involved. You
8325   must use your brain and a collection of other tools to provide a build
8326   scheme to match your plans.
8327   
8328   Of course, you should use CVS to maintain the tools created to support
8329   such a build system (scripts, Makefiles, etc).
8330   
8331   CVS is not a substitute for management.
8332   
8333   You and your project leaders are expected to plan what you are doing.
8334   Everyone involved must be aware of schedules, merge points, branch
8335   names, release dates and the range of procedures needed to build
8336   products. (If you produce it and someone else uses it, it is a
8337   product.) CVS can't cover for a failure to manage your project.
8338   
8339   CVS is an instrument for making sources dance to your tune. But you
8340   are the piper and the composer. No instrument plays itself or writes
8341   its own music.
8342   
8343   CVS is not a substitute for developer communication.
8344   
8345   When faced with conflicts within a single file, most developers manage
8346   to resolve them without too much effort. But a more general definition
8347   of "conflict" includes problems too difficult to solve without
8348   communication between developers.
8349   
8350   CVS cannot determine when simultaneous changes within a single file,
8351   or across a whole collection of files, will logically conflict with
8352   one another. Its concept of a "conflict" is purely textual, arising
8353   when two changes to the same base file are near enough to spook the
8354   merge command into dropping conflict markers into the merged file.
8355   
8356   CVS is not capable of figuring out distributed conflicts in program
8357   logic. For example, if you change the arguments to function X defined
8358   in file A and, at the same time, edit file B, adding new calls to
8359   function X using the old arguments. You are outside the realm of CVS's
8360   competence.
8361   
8362   Acquire the habit of reading specs and talking to your peers.
8363   
8364   CVS is not a configuration management system.
8365   
8366   CVS is a source control system. The phrase "configuration management"
8367   is a marketing term, not an industry-recognized set of functions.
8368   
8369   A true "configuration management system" would contain elements of the
8370   following:
8371   
8372                * Source control.
8373                * Dependency tracking.
8374                * Build systems (i.e. What to build and how to find
8375                  things during a build.  What is shared?  What is local?)
8376                * Bug tracking.
8377                * Automated Testing procedures.
8378                * Release Engineering documentation and procedures.
8379                * Tape Construction.
8380                * Customer Installation.
8381                * A way for users to run different versions of the same
8382                  software on the same host at the same time.
8383
8384   CVS provides only the first.
8385   
8386   Last modified: _6/13/1997_
8387   
8388  Category: /What_is_CVS_/Where_do_I_find_CVS_/
8389  
8390   " + Where do I find CVS? Where can I find Help?"
8391   
8392    1. How do I get more information about CVS? 
8393    
8394     The first thing I would do is to read the Info file that comes with
8395   the CVS sources under "doc". You can format and read the cvs.texinfo
8396   file in two ways: 1. Use TeX to format it and a "dvips" command to
8397   print it and 2. Install the cvs.info files that are created by the
8398   Makefile and read them online using the Emacs "info-mode" or a
8399   stand-alone "info" reader.
8400   
8401     Then I'd run "cvsinit" to set up a Repository and read the man page
8402   while trying out the commands.
8403   
8404   Type "cvs -H" for general help or "cvs -H command" for
8405   command-specific help.
8406   
8407     For background, you can read the original CVS paper (in the source
8408   tree, under "doc"). It describes the purpose of CVS and some of how it
8409   was designed. Note that the emphasis of the document (especially on
8410   multiple vendors providing the same sources) is somewhat out of date.
8411   
8412     For more detailed information about "internals", read the man pages
8413   for RCS. If you are a programmer, you can also read the source code to
8414   CVS.
8415   
8416     Other information and tutorials may be available in the "doc"
8417   directory of the FTP archive described below.
8418   
8419     For current information, and a fair amount of detail, join the
8420   info-cvs mailing list described below.
8421   
8422   Last modified: _6/13/1997_
8423   
8424    2. Is there an archive of CVS material? 
8425    
8426   An anonymous FTP area has been set up. It contains many of the CVS
8427   files you might want, including extra documentation, patches and a
8428   copy of the latest release.
8429   
8430                ftp ftp.delos.com
8431                >>> User:       anonymous
8432                >>> Passwd:
8433                cd /pub/cvs
8434                get README
8435                get Index
8436
8437   The README has more (and more up-to-date) information. The Index
8438   contains a terse list of what is in the archive.
8439   
8440   A WWW home page is also available at http://www.delos.com/cvs.
8441   
8442                          This Didn't Exist 6/23/1998
8443                                       
8444   Last modified: _6/24/1998_
8445   
8446    3. How do I get files out of the archive if I don't have FTP? 
8447    
8448   Use one of the FTP<->Email servers. These are the ones I've been told
8449   about:
8450   
8451     FTPMAIL service is available from the same host as the FTP server
8452   described above. Send mail to "ftpmail@delos.com" containing "help" in
8453   the body of the message. For example, on most Unix systems, you can
8454   type:
8455   
8456   echo help | Mail ftpmail@delos.com
8457   
8458   The FTPMAIL server will respond with a document describing how to use
8459   the server. If the "Mail" command doesn't exist on your system, try
8460   "mailx", "/usr/ucb/mail" or "/bin/mail".
8461   
8462     If you are on BITNET, use Princeton's BITFTP server. Type
8463   
8464   echo 'send help' | Mail bitftp@pucc.princeton.edu
8465   
8466   (It is likely that only BITNET addresses can use this one.)
8467   
8468     Other possibilities I've heard of from the net: (Try the one closest
8469   to you.)
8470   
8471   ftpmail@decwrl.dec.com ftpmail@sunsite.unc.edu ftpmail@cs.arizona.edu
8472   ftpmail@cs.uow.edu.au ftpmail@doc.ic.ac.uk
8473   
8474   Last modified: _6/13/1997_
8475   
8476    4. How do I get a copy of the latest version of CVS? 
8477    
8478   The latest released version of CVS and all the programs it depends on
8479   should be available through anonymous FTP on any FSF archive. The main
8480   FSF archive is at "prep.ai.mit.edu". There are mirrors of the FSF
8481   archive on UUNET and other large Internet sites.
8482   
8483                Program(s)      Suggested revision
8484                -----------     -----------------------
8485                CVS             1.5
8486                RCS             5.7 (latest version available today)
8487                GNU diff        2.7 (or later) [contained in diffutils-2.7]
8488                GDBM            1.5 (or later) [optional]
8489
8490   The GNU version of diff is suggested by both the RCS and CVS
8491   configuration instructions because it works better than the standard
8492   version.
8493   
8494   It is a good idea not to accept the versions of CVS, RCS or diff you
8495   find lying on your system unless you have checked out their
8496   provenance. Using inconsistent collections of tools can cause you more
8497   trouble than you can probably afford.
8498   
8499   The FTP archive mentioned above should contain the latest official
8500   release of CVS, some official and unofficial patches and possibly
8501   complete patched versions of CVS in use somewhere.
8502   
8503   Last modified: _6/13/1997_
8504   
8505    5. Is there a mailing list devoted to CVS? How do I find it? 
8506    
8507   An Internet mailing list named "info-cvs" grew out of the private
8508   mailing list used by the CVS 1.3 alpha testers in early 1992.
8509   Throughout 1994, the list received an average of 100 messages per
8510   month.
8511   
8512   You can add yourself to the mailing list by sending an Email message
8513   to:
8514   
8515                info-cvs-request@prep.ai.mit.edu
8516
8517   (Don't forget the "-request" or you'll send a message to the whole
8518   list, some of whom are capable of remote execution.)
8519   
8520   Mail to the whole list should be sent to:
8521   
8522                info-cvs@prep.ai.mit.edu
8523
8524   An archive of the mailing list is maintained in the FTP archive
8525   mentioned above.
8526   
8527   Last modified: _6/13/1997_
8528   
8529    6. What happened to the CVS Usenet newsgroup I heard about? 
8530    
8531
8532        A Usenet newsgroup named "gnu.cvs.info" was announced in April
8533        1993, with an expected creation date of August, 1993.  However,
8534        nothing came of this.
8535
8536        If you want to discuss CVS on usenet, the correct group is
8537        comp.software.config-mgmt (which also covers other configuration
8538        management systems).  Someday it might be possible to create a
8539        comp.software.config-mgmt.cvs, but only if there is sufficient
8540        CVS traffic on comp.software.config-mgmt.
8541
8542        kingdon@cyclic.com
8543
8544   Last modified: _9/6/1997_
8545     _________________________________________________________________
8546   
8547   [Add an answer to this category]
8548   
8549   [Category /]
8550     _________________________________________________________________
8551   
8552   _Search the FAQ-O-Matic:_ ____________________ Search
8553   [matching all words]
8554   Or look for questions modified in the last: [7.] Days
8555     _________________________________________________________________
8556   
8557   The FAQ-O-Matic lives at http://gille.loria.fr:7000/cgi-bin/faqomatic.
8558   The code was written by Jon Howell, and the content by folks from all
8559   over the web.
8560     _________________________________________________________________
8561