aboutsummaryrefslogtreecommitdiff
path: root/zh_CN.GB2312/articles/cvs-freebsd/article.xml
blob: 5d25306bb5db95accc1528352337812f95d2ff77 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook XML V5.0-Based Extension//EN"
	"http://www.FreeBSD.org/XML/share/xml/freebsd50.dtd">
<!--
     The FreeBSD Documentation Project
     The FreeBSD Chinese (Simplified) Documentation Project

     From FreeBSD: doc/zh_TW.Big5/articles/cvs-freebsd/article.xml,v 1.2 2006/01/31 01:30:59 vanilla
     Original Revision: 1.17
-->
<article xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:lang="zh_cn">
  <info><title>建立 CVS 储存库 (repository) - 以 FreeBSD 的方式</title>
    

    <author><personname><firstname>Stijn</firstname><surname>Hoop</surname></personname><affiliation>
        <address><email>stijn@win.tue.nl</email></address>
      </affiliation></author>

    <pubdate>$FreeBSD$</pubdate>

    <copyright>
      <year>2001</year>
      <year>2002</year>
      <year>2003</year>
      <holder role="mailto:stijn@win.tue.nl">Stijn Hoop</holder>
    </copyright>

    <releaseinfo>$FreeBSD$</releaseinfo>

    <legalnotice xml:id="trademarks" role="trademarks">
      &tm-attrib.freebsd;
      &tm-attrib.general;
    </legalnotice>

    <abstract>
      <para>这份文件描述了使用和 FreeBSD 项目相同的命令脚本来建立 CVS 储存库的步骤。
        这和标准 CVS 建立的储存库相较之下有许多优点,
        它提供了更多对于源代码树的细粒度访问控制,
        并能够为每一次的提交生成和发出易读的电子邮件。</para>
    </abstract>
  </info>

  <sect1 xml:id="introduction">
    <title>简介</title>

    <para>大多数的开放源代码软件项目都使用 <application>CVS</application>
      作为它们的源代码控制系统。 尽管 <application>CVS</application> 有许多的优点,
      但它也有部份的瑕疵和缺点。
      其中之一的原因是和其它的开发者分享源代码树可能会迅速成为系统管理的恶梦,
      特别是当有人希望保护部份的源代码树免受于一般的存取时。</para>

    <para>FreeBSD 是众多使用 <application>CVS</application> 的项目之一,
      因为基于它进行开发的开发人员遍布于全世界。
      他们撰写了一些命令脚本使得管理储存库变得更加容易。
      最近这些命令脚本由 &a.joe; 重新整理过且更标准化,
      使得在其它的项目上再次使用这些命令脚本会更加容易。
      本文件将描述使用这些新的命令脚本的方法。</para>

    <para>为了使本文件中的信息对您有用, 您需要首先熟悉 <application>CVS</application>
      的基本操作方式。</para>
  </sect1>

  <sect1 xml:id="first-setup">
    <title>基本配置</title>

    <warning>
      <para>最好的方式是在一个全新的储存库中执行这些步骤,
        并确定你了解所有的后果。 同时, 请确定你有最新且可读的资料备份!</para>
    </warning>

    <sect2>
      <title>初始化储存库</title>

      <para>首先要做的是建立一个新的储存库, 执行下列命令告诉
        <application>CVS</application> 建立并初始化:</para>

        <screen>&prompt.user; <userinput>cvs -d path-to-repository init</userinput></screen>

      <para>这命令告诉 <application>CVS</application> 建立
        <filename>CVSROOT</filename> 的目录,
        这个目录里放置了所有的配置文件。</para>
    </sect2>

    <sect2>
      <title>配置储存库的用户组</title>

      <para>现在我们将建立一个拥有该储存库的用户组,
        所有的开发者必须加入这个用户组, 这样他们才能够存取该储存库。
        我们假设用户组名称是以 FreeBSD 内部所采用的
        <literal>ncvs</literal></para>

        <screen>&prompt.root; <userinput>pw groupadd ncvs</userinput></screen>

      <para>接着你需要使用 &man.chown.8; 将目录所有者指定给刚刚新增的用户组:</para>

        <screen>&prompt.root; <userinput>chown -R :ncvs path-to-your-repository</userinput></screen>

      <para>如此一来, 没有适当的用户组许可的用户, 就不再能够写入该储存库。</para>
    </sect2>

    <sect2>
      <title>取回源文件</title>

      <para>现在你需要从 FreeBSD 储存库中取回 <filename>CVSROOT</filename> 目录,
        从 FreeBSD 匿名的 CVS 镜像站来取回会是最简单的方法。请查阅 <link xlink:href="&url.books.handbook;/anoncvs.html">在 使用手册 中的相关章节</link>
        来获得更多信息。 我们假设取回的文件存放在相同目录下的
        <filename>CVSROOT-freebsd</filename> 目录中。</para>
    </sect2>

    <sect2>
      <title>复制 FreeBSD 的命令脚本</title>

      <para>接下来我们要复制 FreeBSD <filename>CVSROOT</filename>
        里的文件到你的储存库中。 如果你熟悉 <application>CVS</application>,
        你也许会想你可以直接汇入 (import) 这些命令脚本,
        从而更容易地在未来有新版时进行版本同步; 不过,事实是
        <application>CVS</application> 在这个部份有缺点: 当汇入文件到
        <filename>CVSROOT</filename> 时, 它并不会更新配置文件。
        为了要认出这些文件, 你还需要在汇入它们后一一重新提交, 这就失去了
        <literal>cvs import</literal> 的价值。 因此, 推荐的方法是直接将这些命令脚本复制过去。</para>

      <para>如果您不了解这些操作也没有关系 &mdash; 因为最后的结果都是一样的。
        首先汇出 (checkout) 你的 <filename>CVSROOT</filename>,
        然后复制刚刚取回的 FreeBSD 文件到本地的目录中(尚未变动过):</para>

        <screen>&prompt.user; <userinput>cvs -d path-to-your-repository checkout CVSROOT</userinput>
&prompt.user; <userinput>cd CVSROOT</userinput>
&prompt.user; <userinput>cp ../CVSROOT-freebsd/* .</userinput>
&prompt.user; <userinput>cvs add *</userinput></screen>

      <para>注意: 你很可能会得到一段关于某些目录没有被复制的警告,这是正常的,
        你并不需要用到这些目录。</para>
    </sect2>

    <sect2>
      <title>命令脚本说明</title>

      <para>现在你的工作目录中有了完整 FreeBSD 项目在他们的储存库中使用的命令脚本的副本,
        以下是每个文件简单的介绍。</para>

      <itemizedlist>
        <listitem>
          <para><filename>access</filename> - 此文件在预设的安装中没有被用到。
            它是在 <link linkend="freebsdspecific">FreeBSD 的专用配置</link>
            中用来控制储存库的存取的。 如果你不希望使用这个配置的话,
            则可以删除这个文件。</para>
        </listitem>

        <listitem>
          <para><filename>avail</filename> - 此文件控制储存库的存取。
            在此文件中你可以指定允许存取储存库的用户组,
            也可以针对目录或文件来拒绝提交。
            你应该调整为在你的储存库中将包含的用户组和目录。</para>
        </listitem>

        <listitem>
          <para><filename>cfg.pm</filename> - 此文件说明了配置内容,并提供预设的配置。
            你 <emphasis></emphasis> 应修改此文件, 而应将修改的配置放到
            <filename>cfg_local.pm</filename></para>
        </listitem>

        <listitem>
          <para><filename>cfg_local.pm</filename> - 此文件包含所有的系统配置值。
            你应该配置所有列在此的配置, 例如提交的邮件要寄到哪、
            在哪些主机上的使用者可以提交等等。 更多的相关信息在稍后会提到。</para>
        </listitem>

        <listitem>
          <para><filename>checkoutlist</filename> - 此文件列出所有在
            <application>CVS</application> 控制下此目录中的文件, 除了标准在
            <literal>cvs init</literal> 建立出的文件。 你可以删除某些不需要的
            FreeBSD 专用的文件。</para>
        </listitem>

        <listitem>
          <para><filename>commit_prep.pl</filename> - 此命令脚本执行各种提交前的检查,
            这些检查是否启用, 取决于您在 <filename>cfg_local.pm</filename>
            中所进行的配置。 你不应更动此文件。</para>
        </listitem>

        <listitem>
          <para><filename>commitcheck</filename> - 此命令脚本会直接影响
            <application>CVS</application>。 首先它会使用
            <filename>cvs_acls.pl</filename> 来检查提交者是否可以存取指定的源代码树,
            然后执行 <filename>commit_prep.pl</filename> 来确认各种提交前的检查。
            如果一切正常,<application>CVS</application> 将允许此次提交继续执行。
            你不应更动此文件。</para>
        </listitem>

        <listitem>
          <para><filename>commitinfo</filename> - 此文件是
            <application>CVS</application> 用来定义在提交前所要执行的程序 &mdash;
            在此例中是 <filename>commitcheck</filename>。你不应更动此文件。</para>
        </listitem>

        <listitem>
          <para><filename>config</filename> - 储存库的配置选项。
            你可以修改为你想要的, 但大多数的管理者可能会保留默认值。
            更多关于可以在此配置的选项信息可以查阅 <application>CVS</application> 手册。</para>
        </listitem>

        <listitem>
          <para><filename>cvs_acls.pl</filename> - 此命令脚本定义提交者的身分,
            以及他/她是否允许存取源代码树, 这些判断基于 <filename>avail</filename>
            中的配置。 你不应更动此文件。</para>
        </listitem>

        <listitem>
          <para><filename>cvsignore</filename> - 此文件列出哪些文件
            <application>CVS</application> 不用处理到储存库中,
            你可以修改成你想要的。 更多关于可以此文件的说明可以查阅 <application>CVS</application>
            手册。</para>
        </listitem>

        <listitem>
          <para><filename>cvswrappers</filename> - 此文件是
            <application>CVS</application> 用来启用或停用关键词展开,
            或者是否应将文件视为二进制文件。 你可以修改成你想要的。
            更多关于可以此文件的说明可以查阅 <application>CVS</application> 手册。
            注意 <literal>-t</literal><literal>-f</literal> 选项在
            <application>CVS</application> 客户端/服务器 并不能够正确地运作。</para>
        </listitem>

        <listitem>
          <para><filename>edithook</filename> - 此文件已经不再使用了,
            仅为历史原因保留。 你可以安全地删除此文件。</para>
        </listitem>

        <listitem>
          <para><filename>editinfo</filename> - <application>CVS</application>
            使用这个文件来强迫你使用特定的编辑器。 FreeBSD 没有使用这个功能,
            而对输入的日志信息的检查, 则由 <filename>verifymsg</filename><filename>logcheck</filename> 来完成。 这是因为
            <filename>editinfo</filename> 功能在从远程提交或是使用
            <literal>-m</literal><literal>-F</literal> 选项时不会执行。
            你不应更动此文件。</para>
        </listitem>

        <listitem>
          <para><filename>exclude</filename> - 此文件列出被
            <filename>commit_prep.pl</filename> 定义不能包含修正版标头的文件。
            在 FreeBSD 版本的配置中, 所有在修正版控制下的文件需有一个修正版标头,
            (类似 &dollar;FreeBSD&dollar; 这样)。
            此文件逐行列出不应进行检查的文件名字。
            你可以在此文件中为不需要修正版标头的文件新增一个正则表达式。
            为了安装这些命令脚本, 最好的方法是将
            <filename>CVSROOT/</filename> 从标头检查中排除。</para>
        </listitem>

        <listitem>
          <para><filename>log_accum.pl</filename> - 此命令脚本会处理由
            <filename>logcheck</filename> 所提供的日志信息,
            并且将之为备份目的附加于储存库中的记录文件。
            同时也执行要将邮件寄到你提供的信箱中的程序 (在 <filename>cfg_local.pm</filename> 中)。
            它和 <application>CVS</application> 之间是由 <filename>loginfo</filename>
            负责沟通。 你不应更动此文件。</para>
        </listitem>

        <listitem>
          <para><filename>logcheck</filename> - 此文件分析提交者提供的日志信息,
            并试图对其作清理动作。 它和 <application>CVS</application>
            之间是由 <filename>verifymsg</filename> 负责沟通。 你不应更动此文件。</para>

          <note><para>此命令脚本依赖于经过 FreeBSD 修改的 <application>CVS</application>:
            FreeBSD 版本在此命令脚本修改过后才读取日志信息; 标准的
            <application>CVS</application> 版本虽然能够检查语法上是否正确,
            但并不会清理日志信息。<application>CVS</application> 1.11.2 可以通过在
            <filename>config</filename> 配置 <literal>RereadLogAfterVerify=always</literal>
            来和 FreeBSD 版本有相同的作用。</para></note>
        </listitem>

        <listitem>
          <para><filename>loginfo</filename> - 此文件是
            <application>CVS</application> 用来控制日志信息要寄到哪里,而
            <filename>log_accum.pl</filename> 负责处理。你不应更动此文件。</para>
        </listitem>

        <listitem>
          <para><filename>modules</filename> - 此文件保留了
            <application>CVS</application> 原始的意义。 你应该删除新增的 FreeBSD
            模块, 并修改为你想要的内容。 更多关于可以此文件的说明可以查阅
            <application>CVS</application> 手册。</para>
        </listitem>

        <listitem>
          <para><filename>notify</filename> - 此文件为
            <application>CVS</application> 用来控制监看某个文件。
            在 FreeBSD 的储存库中没有用到此文件,
            你可以修改成你想要的。 更多关于可以此文件的说明,
            可以查阅 <application>CVS</application> 手册。</para>
        </listitem>

        <listitem>
          <para><filename>options</filename> - 此文件仅限使用于 FreeBSD 和 Debian
            的 <application>CVS</application> 版本。
            它包含了需要在修正版标头中展开的关键词。
            你可以修改为符合你在 <filename>cfg_local.pm</filename> 中指定的关键词。</para>
        </listitem>

        <listitem>
          <para><filename>rcsinfo</filename> - 此文件定义提交时,
            储存库所要使用的日志信息样式模板, 如 <filename>rcstemplate</filename>。
            FreeBSD 预设为所有的储存库使用同一个样式模板,
            你可以加入其它你想要的。</para>
        </listitem>

        <listitem>
          <para><filename>rcstemplate</filename> - 此文件是提交者在提交时会看到的日志信息样式模板,
            你应该修改为你在 <filename>cfg_local.pm</filename>
            中定义的各种参数。</para>
        </listitem>

        <listitem>
          <para><filename>tagcheck</filename> - 此文件控制在储存库中贴上标签的存取。
            标准的 FreeBSD 版本拒绝名为 RELENG* 的标签,因为这是 交付工程组 的工作。
            你可以根据需要来修改此文件。</para>
        </listitem>

        <listitem>
          <para><filename>taginfo</filename> - 此文件控制执行在储存库中贴上标签的存取的命令脚本,
            如 <filename>tagcheck</filename>。你不应更动此文件。</para>
        </listitem>

        <listitem>
          <para><filename>unwrap</filename> - 此命令脚本可以用来在汇出时自动 <quote>解开</quote>
            二进制文件 (请见 <filename>cvswrappers</filename>)。 目前 FreeBSD
            并没有使用此配置, 因为此功能在远程提交时执行的并不十分完善。
            你不应更动此文件。</para>
        </listitem>

        <listitem>
          <para><filename>verifymsg</filename> - 此文件用来执行和日志信息相关的命令脚本,
           如 <filename>logcheck</filename>。你不应更动此文件。</para>
        </listitem>

        <listitem>
          <para><filename>wrap</filename> - 此命令脚本可以用来在提交时自动 <quote>包裹</quote>
            二进制文件 (请见 <filename>cvswrappers</filename>)。 目前 FreeBSD
            并没有使用此配置, 因为此功能在远程提交时执行的并不十分完善。
            你不应更动此文件。</para>
        </listitem>
      </itemizedlist>
    </sect2>

    <sect2>
      <title>定制命令脚本</title>

      <para>接下来的步骤要配置这些命令脚本使得它们可以在你的环境中运作。
        你应该检查所有在目录中的文件, 并修改为符合你的配置。
        尤其, 你会想要修改下列的文件:</para>

      <procedure>
        <step>
          <para>如果你不希望使用 <link linkend="freebsdspecific">FreeBSD 的专用配置</link>,
            你可以安全地删除 <filename>access</filename></para>

          <screen>&prompt.user; <userinput>cvs rm -f access</userinput></screen>
        </step>

        <step>
          <para>编辑 <filename>avail</filename> 来包含你想控制存取的各种储存库目录,
            请确定你有保留 <literal>avail||CVSROOT</literal> 这一行,
            否则你将会在下一步把你自己锁在外面。</para>

          <para>另外你可以在此文件中新增开发者的用户组,FreeBSD 预设使用
            <filename>access</filename> 来列出所有的开发者,
            但你可以使用任何你想要用的文件。 如果你想的话也可以新增用户组 (请使用指定在
            <filename>cvs_acls.pl</filename> 前面所介绍的语法)。</para>
        </step>

        <step>
          <para>编辑 <filename>cfg_local.pm</filename> 来包含你需要的选项。
            你应该特别检视一下下列的配置项目:</para>

            <itemizedlist>
              <listitem>
                <para><literal>%TEMPLATE_HEADERS</literal> - 这是用来取得日志信息内容的程序,
                  并加入将呈现的邮件项目和提供非空值的信息。
                  你可以删除 <literal>PR</literal><literal>MFC after</literal>
                  叙述,当然也可以加入你想要的。</para>
              </listitem>

              <listitem>
                <para><literal>$MAIL_BRANCH_HDR</literal> - 如果你想要在每一封提交的邮件中加入描述是在哪一个分支中提交的标头,
                  那么请定义为符合你的配置。 如果你不想使用这样的标头, 那么请配置为空值。</para>
              </listitem>

              <listitem>
                <para><literal>@COMMIT_HOSTS</literal> - 定义使用者能够提交的主机。</para>
              </listitem>

              <listitem>
                <para><literal>$MAILADDRS</literal> - 配置应该收到提交邮件的邮件地址。</para>
              </listitem>

              <listitem>
                <para><literal>@LOG_FILE_MAP</literal> - 以你所需要的来修改这个数组,
                  每个配置值应该符合被提交的目录,而提交的日志信息会以
                  <filename>commitlogs</filename> 的名称储存在每个被配置的目录下。</para>
              </listitem>

              <listitem>
                <para><literal>$COMMITCHECK_EXTRA</literal> - 如果你不想使用
                  <link linkend="freebsdspecific">FreeBSD 专用的存取控制</link>
                  功能, 你可以在此文件中删除对 <literal>$COMMITCHECK_EXTRA</literal>
                  的定义。</para>
              </listitem>
            </itemizedlist>

          <note><para>修改 <literal>$IDHEADER</literal> 的功能只有在 FreeBSD
            平台上可以运作, 它依赖于 FreeBSD 专用的 <application>CVS</application>
            配置。</para></note>

          <para>你可以检查 <filename>cfg.pm</filename> 是否有其它的参数可以修改,
            但是修改最好是有原因的。</para>
        </step>

        <step>
          <para>删除 <filename>exclude</filename> 中关于FreeBSD 的专用配置的叙述
            (如以 <literal>^ports/</literal> 为开头的每一行等)。 此外,
            注释掉以 <literal>^CVSROOT/</literal> 为开头的行列, 然后新增一行只有
            <literal>^CVSROOT/</literal>。 等到关键词展开的命令脚本安装好后,
            你可以在 <filename>CVSROOT</filename> 目录中的文件里加上标头,
            然后再恢复刚刚注释的行列, 但在你还没有提交前则只保持这样。</para>
        </step>

        <step>
          <para>编辑 <filename>modules</filename>, 并删除所有 FreeBSD 的模块。
            加入你需要的模块。</para>
        </step>

        <step>
          <note><para>此步骤只有在你于 <filename>cfg_local.pm</filename> 中指定了
            <literal>$IDHEADER</literal> 才有必要配置 (只有在 FreeBSD 专用的
            <application>CVS</application> 配置上才能够执行)。</para></note>

          <para>编辑 <filename>options</filename> 以符合你在
            <filename>cfg_local.pm</filename> 中配置的标签名称。
            在所有的文件中搜寻 <literal>FreeBSD</literal>
            并替换为你配置的标签名称。</para>
        </step>

        <step>
          <para>修改 <filename>rcstemplate</filename> 为和在
            <filename>cfg_local.pm</filename> 中相同的配置。</para>
        </step>

        <step>
          <para>选择性的删除在 <filename>tagcheck</filename> 中针对 FreeBSD
            检查的配置。你可以仅仅在文件的最上层加上 <literal>exit 0</literal>
            来取消所有标签的检查。</para>
        </step>

        <step>
          <para>在你完成前的最后一件事是确认 commitlogs 可以正确储存。
            预设会储存在储存库中 <filename>CVSROOT</filename> 里的
            <filename>commitlogs</filename> 子目录中,
            而这个目录需要事先建立:</para>

            <screen>&prompt.user; <userinput>mkdir commitlogs</userinput>
&prompt.user; <userinput>cvs add commitlogs</userinput></screen>
        </step>
      </procedure>

      <para>现在, 在细心的检视过后, 你可以提交你的修改了。 确定你先前有在
        <filename>avail</filename> 中允许你自己存取 <filename>CVSROOT</filename>
        目录, 因为如果没有这样做的话你会把你自己锁在外面。
        完整确认过后请执行下列命令:</para>

        <screen>&prompt.user; <userinput>cvs commit -m '- Initial FreeBSD scripts commit'</userinput></screen>
    </sect2>

    <sect2>
      <title>测试配置</title>

      <para>你已经准备好做基本的测试了: 强制提交 <filename>avail</filename>
        以确认每件事都如预期的运作。</para>

        <screen>&prompt.user; <userinput>cvs commit -f -m 'Forced commit to test the new CVSROOT scripts' avail</userinput></screen>

      <para>如果一切正常, 那么恭喜了! 你现在已经为你的储存库建立好 FreeBSD
        的命令脚本了。 如果 <application>CVS</application> 仍然有警告什么,
        回头检视上述的步骤是否有正确的执行。</para>
    </sect2>
  </sect1>

  <sect1 xml:id="freebsdspecific">
    <title>FreeBSD 的专用配置</title>

    <para>FreeBSD 项目自己使用一个有点不同的配置,那就是同时也使用 FreeBSD
      <filename>CVSROOT</filename> 中的 <filename>freebsd</filename> 子目录。
      因为大量的 committer 必须在相同的用户组中, 因此项目写了一个简单的 wrapper
      来确保 committer 可以正确的提交, 并配置储存库的用户组名称。</para>

    <para>如果你的储存库也需要这样的功能,那么下面就会介绍如何建立,
      不过首先要先来看一段复杂的概述。</para>

    <sect2>
      <title>FreeBSD 配置中使用的文件</title>

        <itemizedlist>
          <listitem>
            <para><filename>access</filename> - 此文件用来控制储存库的存取。
              你应该编辑并加入所有在项目中的成员。</para>
          </listitem>

          <listitem>
            <para><filename>freebsd/commitmail.pl</filename> -
              此文件已经不再使用了,
              只是因为历史原因而保留。 你不应更动此文件。</para>
          </listitem>

          <listitem>
            <para><filename>freebsd/cvswrap.c</filename> - 此 CVS wrapper
              源代码是用来建立检查所有存取的工作。更多的信息在稍后会提出。
              你应该编辑 <literal>ACCESS</literal><literal>REALCVS</literal>
              的路径以符合你的配置。</para>
          </listitem>

          <listitem>
            <para><filename>freebsd/mailsend.c</filename> - 此文件是 FreeBSD 设定
              mailing lists 需要的, 你不应更动此文件。</para>
          </listitem>
        </itemizedlist>
    </sect2>

    <sect2>
      <title>步骤</title>

      <procedure>
        <step>
          <para>只把你的用户名加到 <filename>access</filename> 中。</para>
        </step>

        <step>
          <para>编辑 <filename>cvswrap.c</filename> 的路径以符合你的配置,
            定义在大写的 <literal>ACCESS</literal> 中。
            同时如果默认值不符合你的情况的话也应该修改本地实际的 <command>cvs</command>
            程序所在位置。 原始的 <filename>cvswrap.c</filename>
            希望替代服务器端的 CVS 程序,
            例如将其改名为 <filename>/usr/bin/ncvs</filename></para>

          <para>我的 <filename>cvswrap.c</filename> 是这样:</para>

          <programlisting>#define ACCESS "/local/cvsroot/CVSROOT/access"
#define REALCVS "/usr/bin/ncvs"</programlisting>
        </step>

        <step>
          <para>接下来是建立 wrapper 来确认你在提交时是在正确的用户组中。
            在你的 <filename>CVSROOT</filename> 中的
            <filename>cvswrap.c</filename> 要能够使用。</para>

          <para>在你完成编辑并加入正确的路径后我们要来编译源代码:</para>

            <screen>&prompt.user; <userinput>cc -o cvs cvswrap.c</userinput></screen>

	      <para>然后进行需要配置(此步骤需要 root 权限):</para>

            <screen>&prompt.root; <userinput>mv /usr/bin/cvs /usr/bin/ncvs</userinput>
&prompt.root; <userinput>mv cvs /usr/bin/cvs</userinput>
&prompt.root; <userinput>chown root:ncvs /usr/bin/cvs /usr/bin/ncvs</userinput>
&prompt.root; <userinput>chmod o-rx /usr/bin/ncvs</userinput>
&prompt.root; <userinput>chmod u-w,g+s /usr/bin/cvs</userinput></screen>

	      <para>这会将 wrapper 安装成预设的 <command>cvs</command> 程序,
	        请确定任何要使用储存库的人应该有正确的存取权限。</para>
        </step>

        <step>
          <para>现在你可以删除所有在储存库用户组中的使用者,所有的存取控制会经由
            wrapper 完成,同时 wrapper 会配置存取的正确用户组。</para>
        </step>
      </procedure>
    </sect2>

    <sect2>
      <title>测试配置</title>

      <para>你的 wrapper 现在应该已经安装好了,你当然也可以强制提交
        <filename>access</filename> 来测试是否正常:</para>

        <screen>&prompt.user; <userinput>cvs commit -f -m 'Forced commit to test the new CVSROOT scripts' access</userinput></screen>

      <para>同样地,如果有错误,检查是否上述所有步骤都有正确的执行。</para>
    </sect2>
  </sect1>
</article>