Gentoo Archives: gentoo-commits

From: "Le Zhang (r0bertz)" <r0bertz@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] gentoo commit in xml/htdocs/doc/zh_cn: cvs-tutorial.xml metadoc.xml
Date: Wed, 05 Dec 2007 20:09:44
Message-Id: E1J00Yr-0001kg-AF@stork.gentoo.org
1 r0bertz 07/12/05 20:09:37
2
3 Modified: metadoc.xml
4 Added: cvs-tutorial.xml
5 Log:
6 * cvs-tutorial.xml: newly added
7
8 Revision Changes Path
9 1.20 xml/htdocs/doc/zh_cn/metadoc.xml
10
11 file : http://sources.gentoo.org/viewcvs.py/gentoo/xml/htdocs/doc/zh_cn/metadoc.xml?rev=1.20&view=markup
12 plain: http://sources.gentoo.org/viewcvs.py/gentoo/xml/htdocs/doc/zh_cn/metadoc.xml?rev=1.20&content-type=text/plain
13 diff : http://sources.gentoo.org/viewcvs.py/gentoo/xml/htdocs/doc/zh_cn/metadoc.xml?r1=1.19&r2=1.20
14
15 Index: metadoc.xml
16 ===================================================================
17 RCS file: /var/cvsroot/gentoo/xml/htdocs/doc/zh_cn/metadoc.xml,v
18 retrieving revision 1.19
19 retrieving revision 1.20
20 diff -u -r1.19 -r1.20
21 --- metadoc.xml 3 Nov 2007 17:06:33 -0000 1.19
22 +++ metadoc.xml 5 Dec 2007 20:09:36 -0000 1.20
23 @@ -1,6 +1,6 @@
24 <?xml version="1.0" encoding="UTF-8"?>
25 <!DOCTYPE metadoc SYSTEM "/dtd/metadoc.dtd">
26 -<!-- $Header: /var/cvsroot/gentoo/xml/htdocs/doc/zh_cn/metadoc.xml,v 1.19 2007/11/03 17:06:33 r0bertz Exp $ -->
27 +<!-- $Header: /var/cvsroot/gentoo/xml/htdocs/doc/zh_cn/metadoc.xml,v 1.20 2007/12/05 20:09:36 r0bertz Exp $ -->
28 <!-- English CVS version: 1.192 -->
29
30 <metadoc lang="zh_cn" parent="/doc/en/metadoc.xml">
31 @@ -108,7 +108,7 @@
32 <file id="ldap-howto">/doc/en/ldap-howto.xml</file>
33 <file id="nvidia-guide">/doc/en/nvidia-guide.xml</file>
34 <file id="ati-faq">/doc/en/ati-faq.xml</file>
35 - <file id="cvs-tutorial">/doc/en/cvs-tutorial.xml</file>
36 + <file id="cvs-tutorial">/doc/zh_cn/cvs-tutorial.xml</file>
37 <file id="devfs-guide">/doc/en/devfs-guide.xml</file>
38 <file id="distcc">/doc/en/distcc.xml</file>
39 <file id="cross-distcc">/doc/en/cross-compiling-distcc.xml</file>
40
41
42
43 1.1 xml/htdocs/doc/zh_cn/cvs-tutorial.xml
44
45 file : http://sources.gentoo.org/viewcvs.py/gentoo/xml/htdocs/doc/zh_cn/cvs-tutorial.xml?rev=1.1&view=markup
46 plain: http://sources.gentoo.org/viewcvs.py/gentoo/xml/htdocs/doc/zh_cn/cvs-tutorial.xml?rev=1.1&content-type=text/plain
47
48 Index: cvs-tutorial.xml
49 ===================================================================
50 <?xml version="1.0" encoding="UTF-8"?>
51 <!-- $Header: /var/cvsroot/gentoo/xml/htdocs/doc/zh_cn/cvs-tutorial.xml,v 1.1 2007/12/05 20:09:36 r0bertz Exp $ -->
52 <!-- English CVS version: 1.18 -->
53 <!DOCTYPE guide SYSTEM "/dtd/guide.dtd">
54
55 <guide link="/doc/zh_cn/cvs-tutorial.xml" lang="zh_cn">
56
57 <title>Gentoo Linux CVS教程</title>
58
59 <author title="Author">
60 <mail link="drobbins@g.o">Daniel Robbins</mail>
61 </author>
62
63 <author title="Editor">
64 <mail link="neysx@g.o">Xavier Neys</mail>
65 </author>
66
67 <author title="Translator">
68 <mail link="gentoo.kay@×××××.org">王文沛</mail>
69 </author>
70
71 <author title="Editor">
72 <mail link="r0bertz@g.o">张乐</mail>
73 </author>
74
75 <abstract>
76 本教程向读者介绍了一个叫做CVS的版本控制软件,由于它的灵活性而被全球的开发者广泛使用。作为为新接触CVS的人而设计的教程,本文可以让一般用户和新开发者快速的上手。不管你是想用CVS来获取指定文件的最新版本,还是想像一个熟练的开发者一样使用CVS,本教程都会适合你。
77 </abstract>
78
79 <version>1.8</version>
80 <date>2005-05-23</date>
81
82 <chapter>
83 <title>简介</title>
84 <section>
85 <title>本教程的章节说明</title>
86 <body>
87
88 <p>
89 本教程由两部分组成,第一部分是为非开发用户(non-developer)准备的,告诉他们如何使用CVS从别人的源上取得更新。第二部分是为开发者(developer)准备的,此部分告诉你如何从CVS上更改、添加、移除文件以及执行其他与开发者相关的任务。如果你只是接触过CVS,我们建议你先从第一部分开始,然后再学习第二章;如果你有一些CVS经验但是是第一次准备使用CVS来把自己修炼成一个熟练的开发人员,你应该可以在第二章找到你任何你需要的,但是你应该复习一下第一章。
90 </p>
91
92 </body>
93 </section>
94 <section>
95 <title>CVS是什么,CVS用来做什么?</title>
96 <body>
97
98 <p>
99 CVS是一个客户端/服务器系统,它可以让开发人员用来把他们的项目存储在一个统一的位置,这个统一的位置我们称为仓库,通过CVS客户端工具,开发人员可以更改仓库的目录。换句话说,cvs仓库会跟踪每次改变所涉及到所有文件,创建一个关于该开发项目的完整的发展历史。开发人员可以通过请求特定的源文件的旧版本文件,来查看日志的改变,以及执行其他所需的任务。
100 </p>
101
102 </body>
103 </section>
104 <section>
105 <title>CVS的作用</title>
106 <body>
107
108 <p>
109 有很多开源项目都有他们自己的CVS服务器,该服务器是项目开发者们为他们所有的作品而搭建的一个中央仓库。开发人员经常日复一日的不断改进他们的仓库里的代码。通常而言,这些开发者是零落的分散在世界各地的,然而CVS提供了必要的机制将他们的项目联合成为一个统一的整体。CVS把所有人的工作有机的结合在一起,可以使他们的开发人员在改进他们的代码的时候,不会相互影响,也不用担心损失重要数据或者丢失彼此对某些特定文件的重要更新。
110 </p>
111
112 </body>
113 </section>
114 <section>
115 <title>CVS——获取最新的开发源文件</title>
116 <body>
117
118 <p>
119 当开发人员们准备好发布新版本后,他们将会把CVS上现有的代码用tar.gz格式打包,并把它作为他们的软件的一个新的官方版本放出。但是,最近一次放出的官方版本有时候出于种种原因并不是最新的。在第一章,我将会告诉你如何使用CVS来完成一个目的——让自己用上最新的并且是最好的开发版本。
120 </p>
121
122 </body>
123 </section>
124 <section>
125 <title>安装CVS</title>
126 <body>
127
128 <p>
129 安装cvs,只需要输入<c>emerge cvs</c>:
130 </p>
131
132 <pre caption="安装CVS">
133 # <i>emerge cvs</i>
134 </pre>
135
136 </body>
137 </section>
138 <section>
139 <title>关于CVSROOT</title>
140 <body>
141
142 <p>
143 在开始之前,你需要知道一些基本的CVS常识,第一点是连接到CVS仓库的指令,首先你需要知道一个叫做“CVSROOT”的路径。CVSROOT是一个字符串,像URL一样,他是用来告诉cvs命令远程的仓库在哪以及我们是如何连接到它的。有趣的是,CVSROOT有数种格式,取决于CVS仓库是在本地还是在远程机器上,以及连接到它使用什么方法,这里有一些CVSROOT的例子,参看说明……
144 </p>
145
146 </body>
147 </section>
148 <section>
149 <title>一个本地CVSROOT</title>
150 <body>
151
152 <pre caption="设置CVSROOT变量">
153 CVSROOT=/var/cvsroot
154 </pre>
155
156 <p>
157 这是一个本地的CVSROOT路径的例子;你应该使用类似这样CVSROOT,如果你想连接到一个存在于/var/csvroot/的本地仓库的话;当然也有可能这个仓库是通过NFS挂载到/var/cvsroot。
158 </p>
159
160 </body>
161 </section>
162 <section>
163 <title>一个使用密码连接到远程的服务器的CVSROOT</title>
164 <body>
165
166 <pre caption="设置具有带身份验证的CVSROOT变量">
167 CVSROOT=:pserver:cvs@×××××××.com:/var/cvsroot
168 </pre>
169
170 <p>
171 这是一个远程连接的例子,该例是连接到foo.bar.com上的/var/cvsroot目录,":pserver:"部分是告诉我们的客户端使用CVS password server协议连接到远端的机器,该协议是内置在CVS中的,通常而言,公共CVS仓库使用的password server协议允许匿名用户访问。
172 </p>
173
174 </body>
175 </section>
176 <section>
177 <title>一个使用rsh/ssh连接的CVSROOT</title>
178 <body>
179
180 <pre caption="使用RSH/SSH的CVSROOT变量设置">
181 CVSROOT=drobbins@×××××××.com:/data/cvs
182 </pre>
183
184 <p>
185 这是一个使用RSH/SSH协议的CVSROOT实例;在本例中,CVS服务将使用drobbins帐户试图访问foo.bar.com上的仓库。如果CVS_RSH环境设置为SSH,那么我们的cvs客户端将会尝试使用ssh连接,否则将会使用rsh。对于关注安全性的用户来说ssh连接方法是很实用的;但是,不要对匿名帐户开放获取源文件的RSH或SSH方法。要想使用这种方法,你必须要在foo.bar.com上拥有一个可登录的帐户。
186 </p>
187
188 </body>
189 </section>
190 <section>
191 <title>其他注意事项</title>
192 <body>
193
194 <p>
195 除了CVSROOT,你还需要知道你想要检出的模块(源代码的集合)名称,以及匿名帐户的密码。不同于可匿名登录的FTP,匿名用户并没有“标准”的密码,因此你需要从开发者的网站或者是开发人员那里获得指定的密码。一旦你有了这些资料,你就可以开始使用CVS了。
196 </p>
197
198 </body>
199 </section>
200 <section>
201 <title>CVS交互,第一部分</title>
202 <body>
203
204 <p>
205 获取源代码有两个步骤,首先,我们使用密码登录到服务器,然后我们使用<c>checkout</c>命令获取源,以下是一个关于如何使用命令来检测最新版本的Samba源的例子,Samba是一个流行的UNIX/Windows整合项目:
206 </p>
207
208 <pre caption="设置CVSROOT">
209 # <i>export CVSROOT=:pserver:cvs@×××××××××××××.org:/cvsroot</i>
210 </pre>
211
212 <p>
213 第一个命令是设置CVSROOT环境变量,如果你不设置该变量,那么之后的两个命令需要在<c>cvs</c>命令之后追加一个选项<c>-d :pserver:cvs@×××××××××××××.org:/cvsroot</c>。导出CVSROOT可以省了我们输入的麻烦。
214 </p>
215
216 </body>
217 </section>
218 <section>
219 <title>CVS交互, 第二部分</title>
220 <body>
221
222 <p>
223 以下是得到当前开发者源文件的副本的命令。你可以先跳过本节到下一节去查看这些命令说明,然后再返回这里:
224 </p>
225
226 <pre caption="检出源文件">
227 # <i>cvs login</i>
228 (Logging in to cvs@×××××××××××××.org)
229 CVS password: <comment>(在此输入密码)</comment>
230
231 # <i>cvs -z5 co samba</i>
232 U samba/COPYING
233 U samba/Manifest
234 U samba/README
235 U samba/Read-Manifest-Now
236 U samba/Roadmap
237 U samba/WHATSNEW.txt
238 <comment>(这只是完整的cvs co输出的一部分)</comment>
239 </pre>
240
241 </body>
242 </section>
243 <section>
244 <title>CVS交互——说明</title>
245 <body>
246
247 <p>
248 上述的第一个命令的作用是让我们登录到pserver,第二个命令则是告诉我们的CVS客户端使用gzip的压缩级别5去检出samba模块,对于较慢网络连接这样可加速检出过程。对于每一个在本地新创建的文件,cvs会输出“U [path]”来标识这个文件已经在硬盘上更新。
249 </p>
250
251 </body>
252 </section>
253 <section>
254 <title>完成检出</title>
255 <body>
256
257 <p>
258 一旦命令执行完毕,你将会在当前工作目录看到一个包含最近版本的源文件的“samba”目录。你也会注意到所有的目录都有一个“CVS”目录——CVS在该目录里统计信息,而且这些文件完全可以不理。从这个角度看,我们不需要关心是否将CVSROOT声明为环境变量或是在命令行中作出了声明。因为CVSROOT现在被缓存到额外的“CVS”目录中。记住——你只需要在初始化和检验登录的才需要设置CVSROOT。
259 </p>
260
261 </body>
262 </section>
263 <section>
264 <title>更新你的源文件</title>
265 <body>
266
267 <p>
268 OK,现在你就有了新的源码了!对于在你手中的这些源码,你可以阅读,编译或者安装它们,或者做任何你想对它做的事。
269 </p>
270
271 <p>
272 你可能经常要将自己的版本和CVS服务器同步,如果进行此操作的话,你不需要再登录到pserver;你的验证信息已经被cvs缓存在那些“CVS”目录。首先,进入主验证目录(本例为“samba”),然后输入:
273 </p>
274
275 <pre caption="更新你的源文件">
276 # <i>cvs update -dP</i>
277 </pre>
278
279 </body>
280 </section>
281 <section>
282 <title>使用cvs update,第一部分</title>
283 <body>
284
285 <p>
286 如果有任何新文件,cvs将会对每个更新的文件输出“U [path]”。同样的,如果你编译过之前的源文件,你将会看到有很多“? [path]”行,那些目标文件是cvs发现的不存在于远程仓库的文件。
287 </p>
288
289 </body>
290 </section>
291 <section>
292 <title>使用cvs update,第二部分</title>
293 <body>
294
295 <p>
296 同样地,注意这两个“cvs update”命令行选项。“-d”告诉cvs创建任何已经添加到仓库的新目录(默认这是不会发生的),“-P”告诉cvs从你自己本地的拷贝的源文件中把任何空目录移除。“-P”是一个好的建议,因为cvs随着时间的推移,会累积大量空(曾经使用过,但是现在已经废弃的)目录。
297 </p>
298
299 <p>
300 以上就是你从CVS获取源文件所要知道的知识, 下面我们来看看作为开发人员如何与CVS交互。
301 </p>
302
303 </body>
304 </section>
305 </chapter>
306
307 <chapter>
308 <title>CVS的开发应用</title>
309 <section>
310 <title>修改文件</title>
311 <body>
312
313 <p>
314 做为一个开发人员,你将会在CVS里更改你的文件。要想进行此操作,直接更改仓库本地的副本就可以了。你对源文件的修改只有在你告诉cvs去“commit”的时候才会在远程的仓库上生效。当你测试过你所有的更改,确认他们能够正常的工作,并且你已经做好了将这些改变应用到仓库的准备后,做下面两步。首先,在你的源文件的主目录输入以下命令来更新你的源文件。
315 </p>
316
317 <pre caption="更新源文件和目录">
318 # <i>cvs update -dP</i>
319 </pre>
320
321 </body>
322 </section>
323 <section>
324 <title>CVS能够合并其他人的更改</title>
325 <body>
326
327 <p>
328 正如我们之前看到的,“cvs update”将会让你的源文件升级到respository中的最新的版本——那么,你所做的修改怎么样了呢?不用担心,他们并没有丢失。如果有另一个开发者改变了一个你没有碰过的文件,你的本地文件将会被更新以使它的版本与仓库保持一致。
329 </p>
330
331 <p>
332 此外,如果你改变了一个本地文件的1到10行,另一个开发人员删除了第40-50行,并且在文件的末尾添加了12行,改变了第30-40行然后在你提交到仓库之前提交上去,cvs将会巧妙的将这些改变应用到你本地的副本从而保证了你的改变不会丢失。这个机制允许多个开发人员在相同的时间处理相同文件的不同部分。
333 </p>
334
335 </body>
336 </section>
337 <section>
338 <title>合并功能并不总能完美的合并</title>
339 <body>
340
341 <p>
342 但是,如果多个开发人员对<c>相同文件的相同区域</c>作出更改,这种事情会变得有些复杂的。如果发生了这种事情,那么cvs将会告知你此处有一个冲突。所有的改动都不会丢失,但是此时就必须要手动修正了,因为cvs需要你来决定如何合并相互冲突的改变。
343 </p>
344
345 </body>
346 </section>
347 <section>
348 <title>关于commit</title>
349 <body>
350
351 <p>
352 我们一会将会详细的讨论一下冲突是如何解决的,但是在开始之前,让我们假定在你输入“cvs update -dP”之后是没有冲突的——通常是不会发生冲突的。没有冲突的话,你的本地源文件就被更新得和仓库一致了,然后你就可以把你的修改提交到仓库了,在你的源文件主目录下输入如下命令即可:
353 </p>
354
355 <pre caption="提交修改">
356 # <i>cvs commit</i>
357 </pre>
358
359 </body>
360 </section>
361 <section>
362 <title>commit做了什么</title>
363 <body>
364
365 <p>
366 “cvs commit”不<c>仅仅</c>是将你的修改应用于仓库。事实上在把你的修改提交到远程仓库之前,cvs将会激活你默认的编辑器来让你输入对修改的描述。一旦你添加了注解,保存文件并且退出编辑器,你的修改(包括注释)将会在远程的仓库生效并且你的团队中的其他开发人员将能够看到这些修改。
367 </p>
368
369 </body>
370 </section>
371 <section>
372 <title>查看日志</title>
373 <body>
374 <p>
375 我们可以很容易的访问一个特定文件的完整历史,在提交时追溯开发人员建立的注释(包括你的)。想要查看此信息,输入:
376 </p>
377
378 <pre caption="查看日志信息">
379 # <i>cvs log myfile.c</i>
380 </pre>
381
382 <p>
383 “cvs log”命令是递归的,因此如果你想查看整个目录树的完整的日志,只需要进入目录然后输入:
384 </p>
385
386 <pre caption="使用分页程序查看日志">
387 # <i>cvs log | less</i>
388 </pre>
389
390 </body>
391 </section>
392 <section>
393 <title>Commit选项</title>
394 <body>
395
396 <p>
397 在你输入cvs commit的时候,你可以使用另外的编辑器来取代默认的值,如果你打算这么做的话,你只需要将你的EDITOR环境变量设置成你想要使用的编辑器的名称。在<c>~/.bashrc</c>中设置该变量将是个很好的主意:
398 </p>
399
400 <pre caption="设置我们的编辑器">
401 export EDITOR=jpico
402 </pre>
403
404 <p>
405 此外,你也可以指定日志信息作为一个命令行选项,使CVS在commit时不启动编辑器:
406 </p>
407
408 <pre caption="使用少量的日志信息来提交修改">
409 # <i>cvs commit -m 'I fixed a few silly bugs in portage.py'</i>
410 </pre>
411
412 </body>
413 </section>
414 <section>
415 <title>关于.cvsrc文件</title>
416 <body>
417
418 <p>
419 在我们继续学习更多的cvs命令之前,我建议设置<c>~/.cvsrc</c>文件,在你home目录下的<c>.cvsrc</c>可以告诉cvs使用首选的命令行的默认选项,这样可以让你不需要每次都记住这些命令,下面是我们建议的默认 <c>.cvsrc</c> 文件
420 </p>
421
422 <pre caption="推荐的默认设置">
423 cvs -q
424 diff -u -b -B
425 checkout -P
426 update -d -P
427 </pre>
428
429 </body>
430 </section>
431 <section>
432 <title>继续设置.cvsrc文件</title>
433 <body>
434
435 <p>
436 在这一系列有用的选项中,<c>.cvsrc</c>的第一行把cvs设置为安静模式,有利于使 <c>cvs update</c>输出更多的consise以及增强可读性。同样的,一旦你设置了cvsrc文件,你可以输入<c>cvs update</c>来代替<c>cvs update -dP</c>。
437 </p>
438
439 </body>
440 </section>
441 <section>
442 <title>将文件添加到仓库</title>
443 <body>
444
445 <p>
446 我们可以很容易的把源文件添加到CVS。首先,用你最喜欢的编辑器创建一个文件,然后输入如下内容:
447 </p>
448
449 <pre caption="添加文件">
450 # <i>cvs add myfile.c</i>
451 cvs server: use 'cvs commit' to add this file permanently
452 </pre>
453
454 <p>
455 上述提示的意思是只有在你使用了<c>cvs commit</c>命令之后其他开发人员才能看到新添加的文件。
456 </p>
457
458 </body>
459 </section>
460 <section>
461 <title>将一个目录添加到仓库</title>
462 <body>
463
464 <p>
465 仿照如下步骤将目录添加到CVS的方法:
466 </p>
467
468 <pre caption="添加目录">
469 # <i>mkdir foo</i>
470 # <i>cvs add foo</i>
471 Directory /var/cvsroot/mycode/foo added to the repository
472 </pre>
473
474 <p>
475 添加目录不同于添加文件,在你添加目录的时候它就出现在仓库中了;你不需要使用cvs commit命令,在你添加本地目录到cvs的时候,你会注意到一个“CVS”目录会该目录内创建,他的作用是保存cvs的帐户数据。因此,通过查找“CVS”目录,你能够轻易的判断出现行的目录是否已经加入到cvs中。
476 </p>
477
478 </body>
479 </section>
480 <section>
481 <title>“cvs add”注意事项</title>
482 <body>
483
484 <p>
485 哦,正如你所假想的,在你添加文件或者添加目录到仓库的时候,你必须要确定他的父目录已经添加到了CVS,否则,你可能会得到一个类似如下的错误:
486 </p>
487
488 <pre caption="在添加文件时失败">
489 # <i>cvs add myfile.c</i>
490 cvs add: cannot open CVS/Entries for reading: No such file or directory
491 cvs [add aborted]: no repository
492 </pre>
493
494 </body>
495 </section>
496 <section>
497 <title>熟悉“cvs update”命令,第一部分</title>
498 <body>
499
500 <p>
501 在我们学习如何解决冲突之前,让我们先熟悉一下“cvs update”命令。如果你创建了~/.cvsrc文件并且在文件中包含了“cvs -q”行,你会发现“cvs update”的输出容易读的多。“cvs update”会把它完成的和看到的按照一个单独的字符、一个空格加一个文件名的格式输出来通知你,就像下面的例子:
502 </p>
503
504 <pre caption="更新CVS">
505 # <i>cvs update -dP</i>
506 ? distfiles
507 ? packages
508 ? profiles
509 </pre>
510
511 </body>
512 </section>
513 <section>
514 <title>熟悉“cvs update”命令,第二部分</title>
515 <body>
516
517 <p>
518 “cvs update”使用“?”来告诉你它对于在你的本地仓库副本中找到的这些特定的文件一无所知。这不是官方仓库的一部分,或者他们只是准备要添加的文件。这里有一个其他所有的单字母信息的清单。
519 </p>
520
521 <pre caption="U标志的相关信息">
522 U [path]
523 </pre>
524
525 <p>
526 该标志说明:该文件是你在本地仓库创建的,或者该文件被其他人修改了并本地副本已经被更新。
527 </p>
528
529 <pre caption="A标志的相关信息">
530 A [path]
531 </pre>
532
533 <p>
534 该标志说明:当前文件将要被添加,并且将在你使用<c>cvs commit</c>命令的时候添加到官方的仓库
535 </p>
536
537 </body>
538 </section>
539 <section>
540 <title>熟悉“cvs update”命令,第三部分</title>
541 <body>
542
543 <pre caption="R标志的相关信息">
544 R [path]
545 </pre>
546
547 <p>
548 类似于“A”,“R”标志,该标志会通知你该文件将在你使用<c>cvs commit</c>命令的时候被移除。
549 </p>
550
551 <pre caption="M标志的相关信息">
552 M [path]
553 </pre>
554
555 <p>
556 该标志意味着此文件已经被你更改;此外,它也可能是仓库成功合并文件后产生的更改。
557 </p>
558 <pre caption="C标志的相关信息">
559 C [path]
560 </pre>
561
562 <p>
563 “C”标志表示该文件产生了冲突并且在你使用“cvs commit”提交前需要手动修复。
564 </p>
565
566 </body>
567 </section>
568 <section>
569 <title>解决冲突概述</title>
570 <body>
571
572 <p>
573 现在,让我们看看如何解决冲突。我在Gentoo Linux项目中非常活跃,我们在cvs.gentoo.org建立了自己的cvs服务器。我们的开发人员把他们绝大多数的时间都花在开发gentoo-x86模块中的代码上。我们有一个叫做“ChangeLog”的文件,我们把我们对仓库中的文件作出主要更改都记录在这个文件里。
574 </p>
575
576 </body>
577 </section>
578 <section>
579 <title>一个冲突的例子</title>
580 <body>
581
582 <p>
583 由于我们在对CVS做了主要的更改后都要去修改该文件,这就产生了源文件的一个主要冲突——这里有一个冲突的例子。我在Changelog文件的顶端添加了如下的行:
584 </p>
585
586 <pre caption="ChangeLog条目">
587 date 25 Feb 2001
588
589 This is the thing I added myself
590 </pre>
591
592 <p>
593 但是,让在我提交这三行之前,另一个开发人员添加了以下这些行并且提交了他们。
594 </p>
595
596 <pre caption="ChangeLog条目2">
597 date 25 Feb 2001
598
599 This is the part added by another developer
600 </pre>
601
602 </body>
603 </section>
604 <section>
605 <title>开始之前,一个冲突的实例</title>
606 <body>
607
608 <p>
609 现在,当我运行<c>cvs update -dP</c>(你每次提交之前都应该这么做), cvs不能在我的本地Changelog副本中合并这些改变,因为我们都在相同的位置添加了额外的行——cvs怎么可能知道我们使用的是哪个版本?因此,CVS会通知我得到了如下错误:
610 </p>
611
612 <pre caption="CVS错误信息">
613 RCS file: /var/cvsroot/gentoo-x86/ChangeLog,v
614 retrieving revision 1.362
615 retrieving revision 1.363
616 Merging differences between 1.362 and 1.363 into ChangeLog
617 rcsmerge: warning: conflicts during merge
618 cvs server: conflicts found in ChangeLog
619 C ChangeLog
620 </pre>
621
622 </body>
623 </section>
624 <section>
625 <title>解决冲突,第一部分</title>
626 <body>
627
628 <p>
629 啊~——出现冲突!所幸的是,解决该冲突是很简单的。当我用我喜欢的文本编辑器打开这个文件,那么会在Changelog的顶端看到如下的文本
630 </p>
631
632 <pre caption="ChangeLog冲突">
633 &lt;&lt;&lt;&lt;&lt;&lt;&lt; ChangeLog
634 date 25 Feb 2001
635
636 This is the thing I added myself
637
638 =======
639 date 25 Feb 2001
640
641 This is the part added by another developer
642
643 &gt;&gt;&gt;&gt;&gt;&gt;&gt; 1.363
644 </pre>
645
646 </body>
647 </section>
648 <section>
649 <title>解决冲突,第2部分</title>
650 <body>
651
652 <p>
653 在这里,CVS并不是用一个版本取代了另一个版本,而是把两个版本都添加到了ChangeLog文件中,使用特殊的分隔符清楚的标记出冲突。现在还得由我来决定哪些<e>应该</e>出现在ChangeLog中;在这种情况下,我们不是对两个版本进行替换,而是将两者合并:
654 </p>
655
656 <pre caption="ChangeLog新条目">
657 date 25 Feb 2001
658
659 This is the thing I added myself
660
661 This is the part added by another developer
662 </pre>
663
664 <p>
665 现在我已经解决了冲突,(并且移除了“=======”等等标记),我现在提交我的修改已经没有任何问题了。
666 </p>
667
668 </body>
669 </section>
670 <section>
671 <title>解决冲突的技巧</title>
672 <body>
673
674 <p>
675 每当你编辑出现冲突的文件的时候,请确定你已经遍阅整个文件发现了所有的冲突;如果你漏掉了某个冲突,cvs是不允许你提交它的,直到你把所有的冲突都解决掉才可以提交!移除那些特定的分隔符也是很重要的。另一方面——如果你在解决冲突的时候发生了错误而且("D'oh!")不小心保存了更改,你可以在“.#filename.version”可以找到你原始的副本。
676 </p>
677
678 </body>
679 </section>
680 <section>
681 <title>移除文件</title>
682 <body>
683
684 <p>
685 现在,是我们学习CVS最后的技能的时候了——从仓库中移除文件。移除一个文件分两步。首先,从你本地的源文件副本中删除该文件,然后执行<c>cvs remove</c>命令:
686 </p>
687
688 <pre caption="移除文件">
689 # <i>rm myoldfile.c</i>
690 # <i>cvs remove myoldfile.c</i>
691 </pre>
692
693 </body>
694 </section>
695 <section>
696 <title>移除文件的后续过程</title>
697 <body>
698
699 <p>
700 这个文件将在你下次commit的时候被从仓库中移除。一旦commit过的话,该文件将会正式的被从官方的仓库上移除。但是,cvs不能把这个文件丢弃,他仍然会保持该文件完整的记录和它的历史,万一你在将来会需要他们可以找到他们。这只是CVS保护你宝贵的源代码的诸多方法中的一种而已。
701 </p>
702
703 <p>
704 <c>cvs remove</c>是递归的,它意味着你可以批量删除文件,在父文件目录不调用其他的参数运行<c>cvs remove</c>命令。这样将会导致所有已经被删除的文件在下次commit的时候被从服务器上移除。
705 </p>
706
707 </body>
708 </section>
709 <section>
710 <title>移除目录</title>
711 <body>
712
713 <p>
714 如果你想要移除完整的目录,我建议你遵循以下过程。首先,彻底删除文件然后使用“cvs remove”命令移除整个文件目录。
715 </p>
716
717 <pre caption="移除文件">
718 # <i>rm *.c</i>
719 # <i>cvs remove</i>
720 </pre>
721
722 </body>
723 </section>
724 <section>
725 <title>移除目录的后续过程</title>
726 <body>
727
728 <p>
729 然后,执行commit:
730 </p>
731
732 <pre caption="提交更改">
733 # cvs commit
734 </pre>
735
736 <p>
737 移除目录的时机到了,执行以下步骤删除该目录:
738 </p>
739
740 <pre caption="移除目录">
741 # <i>cd ..</i>
742 # <i>cvs remove mydir</i>
743 # <i>rm -rf mydir</i>
744 </pre>
745
746 <p>
747 注意,删除目录不需要再次commit——目录在添加和移除的时候是实时的。
748 </p>
749
750 </body>
751 </section>
752 <section>
753 <title>学习完成!</title>
754 <body>
755
756 <p>
757 对CVS的讲解已经完成——我希望这份教程是有用的,CVS所涉及的知识不是本教程所能覆盖的,但是所幸这里有很多的CVS资源可以方便你使用,在将来你可以用它们来扩展你的CVS知识:
758 </p>
759
760 <ul>
761 <li>
762 <uri>http://www.cvshome.org</uri>是CVS开发官方网站,提供大量的CVS相关的文档,包括<uri link="http://www.cvshome.org/docs/manual">官方CVS在线文档</uri>
763 </li>
764 <li>
765 <uri link="http://www.durak.org/cvswebsites/">WEB网站项目相关的CVS版本控制</uri>为使用CVS做版本控制的web开发的提供了大量的有用的信息
766 </li>
767 <li>
768 Karl Fogel写过一本书叫做<uri link="http://cvsbook.red-bean.com/">Open Source Development with CVS</uri>。有数章在他们的网站上是免费提供的。
769 </li>
770 <li>
771 <uri link="http://www.freebsd.org/projects/cvsweb.html">cvsweb</uri>为你的CVS仓库提供了一个很好的CGI脚本的web接口;非常便于浏览代码。
772 </li>
773 <li>
774 <uri link="http://www.loria.fr/~molli/cvs-index.html">CVS Bubbles</uri>网站有大量的不错的资源的包括CVS FAQ-o-matic.
775 </li>
776 </ul>
777
778 </body>
779 </section>
780 <section>
781 <title>关于本教程</title>
782 <body>
783
784 <p>
785 本教程的原始版本第一次刊登在IBM developerWorks,所有权属于Westtech Information Services. 当前的文档对原教程做了更新, 由Gentoo Linux documentation team做了很多改进.
786 </p>
787
788 </body>
789 </section>
790 </chapter>
791 </guide>
792
793
794
795 --
796 gentoo-commits@g.o mailing list