﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-weibogao-随笔分类-project management</title><link>http://www.blogjava.net/weibogao/category/19263.html</link><description>my second lifespace</description><language>zh-cn</language><lastBuildDate>Sat, 03 Mar 2007 04:58:30 GMT</lastBuildDate><pubDate>Sat, 03 Mar 2007 04:58:30 GMT</pubDate><ttl>60</ttl><item><title>用CVS来管理自己的程序</title><link>http://www.blogjava.net/weibogao/archive/2007/01/16/94195.html</link><dc:creator>weibogao</dc:creator><author>weibogao</author><pubDate>Tue, 16 Jan 2007 04:49:00 GMT</pubDate><guid>http://www.blogjava.net/weibogao/archive/2007/01/16/94195.html</guid><wfw:comment>http://www.blogjava.net/weibogao/comments/94195.html</wfw:comment><comments>http://www.blogjava.net/weibogao/archive/2007/01/16/94195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weibogao/comments/commentRss/94195.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weibogao/services/trackbacks/94195.html</trackback:ping><description><![CDATA[
		<a href="http://51cmm.csai.cn/casepanel/CM/No047.htm">
				<font color="#1d58d1">http://51cmm.csai.cn/casepanel/CM/No047.htm</font>
		</a>
		<br />
		<p>每个编写程序的人也许都有过这样的体验：对编写的程序作了一些修改，几天以后，我们可能发现上次的修改导致了其它的矛盾，甚至编译不能通过，但这时我们却很难找到自己刚在哪里作了改动。一般说来，我们总是希望自己完整的记录下一个程序开发的过程，记录下这个程序的每一点改进和调整。或许我们可以用备份的方法来解决这个问题，于是我们建立一个backup的目录，定期或不定期的将自己的源程序打包放进去，直到某一天整个硬盘都被这些文件撑满。这当然有些夸张，但这种机制带给我们的不方便是显而易见的。更进一步，现在一个软件产品的开发，一个人单枪匹马很难完成。可能是包含几个、几十个乃至上百个程序员协作开发，这时的源代码又该如何管理？解决问题的方法就是使用CVS。 <br />　　CVS - Concurrent Versions System(并发版本管理系统)是一个版本控制管理系统，它是目前最为广泛使用的一个系统。从gftp到gtk到KDE，你几乎可以在每一个你熟悉的自由软件的源码里看到它的踪迹(下面我们会知道，它的踪迹指一个称为cvs的子目录)。同样，你也可以在几乎每一个Linux的发行版本里看到CVS系统。可以说，如果失去了CVS，现有的许多多人协作、自由开发的软件都会在一定程度上放慢自己发展的步伐。 　　CVS到底有哪些功能，使得它有如此强大的魅力呢？<br /><strong>　　1.CVS能做什么？</strong><br />　　　如上所说，CVS首先是一个版本管理系统，它可以保留软件开发过程中的每一个版本的信息，包括谁、在何时、作了什么样的修改以及为什么作这样的修改等。这个功能和以前流行于Linux和Unix的版本管理系统RCS(Revision Control System)和SCCS(Source Code Control System)很象。但CVS的功能远非仅此。它的最大的特点是它的并发性，即它支持分布式项目的开发。在互联网席卷一切的今天，这个功能太为重要了。小到一个办公室内部开发一个OA系统，大到KDE小组利用互联网开发新版本的KDE，CVS都可以一展身手。一个程序员开发出了自己负责模块的新版本后，迅速的通过CVS让开发组的每一个成员都分享自己的最新成果。甚至，CVS通过特定的机制允许多个程序员同时修改同一个源程序文件。<br />　　另外CVS增强的目录结构以及对二进制文件良好的处理，都使得它远远优于其它的版本管理系统。最后，必须一提的是CVS是基于RCS开发而成的。<br /><strong>　　2.如何得到CVS?<br /></strong>　　　CVS在几乎包含在所有的Linux发布版本中，如RedHat、Turbo Linux、Slackware以及国产的红旗、Xteam Linux等。你可以试着敲一下cvs命令，大多数情况下都会出现以Usage: cvs开头的一堆信息，提示你如何使用cvs，这意味着在你的机器上早已有了CVS，只是遗憾的是它一直未被你发现和利用。运气不好的话，你会看到形如cvs: Command not found.的提示，这意味着你的机器没有安装CVS。这时你有两种选择。一是找到你的Linux安装盘，从那里安装CVS。例如在使用RPM方式安装的Linux(上面介绍的几个发布版本中似乎除了Slackware，其他都是)发布版本中，找到cvs***.rpm，用rpm命令进行安装。第二种方式是到一些站点cvs的源代码，然后遵循里面附带的指导进行安装，需要的读者请访问站点www.cyclic.com/或者http://www.loria.fr/~molli/cvs-index.html。<br /><strong>　　3.CVS的基本使用方法<br /></strong>　　　在这一节里，我们来学习掌握CVS的一些基本使用方法。现在我们假定已经安装好了CVS，并且我们打算用它来管理自己正在开发的一个软件，软件名叫netants，它存放在硬盘上一个叫做netants的目录里，目前里面有了文件netants.c、netants.h、http.c、http.h和Makefile。我们并没有和它人协作开发这个软件，也没有利用Internet或者Intranet来开发这个软件。或许，它只是自己的一个业余作品，试图写出一个比Windows下的网络蚂蚁更好的下载工具出来。<br /><strong>　　3.1初始化CVS　<br /></strong>　　我们首先要使用的命令是cvs init，这个命令用来初始化CVS系统。正如我们所看到的，所有的CVS命令都以cvs开头，然后在后面紧跟命令、参数和一些选项。初始化CVS系统主要是为了创建一个为CVS所使用的源码储存库(repository)。创建的时候，需要指定在那个目录下创建这个源码储存库。有两种方法来指定目录。一是利用"-d "选项来指定，例如：-d /usr/local/cvsroot。另一种更方便的方法是在shell里设定一个名叫CVSROOT的环境变量。使用csh或者tcsh的用户可以使用命令setenv来设定，在文件.csh rc或者文件.tcshrc里添加入下的一行：　setenv CVSROOT /usr/local/cvsroot　使用sh或者bash的用户需要在文件.profile或者文件.bashrc里添加如下两行：　CVSROOT=/usr/local/cvsroot　export CVSROOT　设置了环境变量CVSROOT后，我们运行命令cvs init，CVS将在指定的目录下面建立自己所需要的一些文件，以后我们使用CVS管理的任何项目，都会被CVS储存在这个目录之下。不过千万要注意的是：永远不要去试图修改这个目录下的文件。这个目录是由CVS自己进行管理的，轻率的改动可能会导致你丢失你部分或全部的交由CVS管理的源代码或其他资源。<br /><strong>　　3.2导入项目到CVS中去<br /></strong>　　初始化结束以后，我们就要真正开始利用CVS来管理自己的程序网络蚂蚁了。第一步，我们将这个项目交由CVS管理。使用如下的CVS的import命令，将源程序导入到CVS的源码储存库中去：　cd netants　cvs import -m "start my project: Netants" netants yoyo start　这个命令看起来有些复杂，需要解释一下。import是cvs的导入命令，默认状况下，它循环的将当前目录下的所有文件(包括子目录)导入到源码库(即CVSROOT指定的目录)里去。-m "start my project: Netants"告诉CVS你对这一步操作的说明。这是CVS强制要求的，如果你没有使用这种-m "字符串"的选项，CVS将会弹出一个文本编辑器(如果自己不特别指定的话，在Linux下一般是vi，而在Windows下则是Notepad)，让你输入一些说明信息它才罢休。netants是这个项目被CVS存储时的路径名，即CVS将在创建一个$CVSROOT/netants的目录，并在此目录下存放此项目的文件，当然，它不是原封不动的存储，CVS会做一番处理。最后两个字符串设定了两个标记(tag)，现在并没有什么用处，但它们同样是CVS指定必需的，所以我们添上这两个参数。执行此命令时，CVS自动将所有的文件版本设为1.1，这是它所认为的最低版本。以下为执行上述命令后的显示信息：N netants/netants.c N netants/http.c N netants/http.h N netants/netants.h N netants/Makefile No conflicts created by this import N表示New，CVS成功的加载了这些文件，并没有发现冲突。　上面的命令稍长了一些，而且显得有些繁琐，相信我，CVS不总是这样的，这点"繁琐"相对它给我们带来的便利是完全可以忽略不计的。<br /><strong>　　3.3从CVS中导出项目　<br /></strong>　　好了，我们把自己的netants的项目交给了CVS去管理，现在，我们完全可以删除原有的存储我们代码的netants目录(当然，安全起见，你或许应该再做一次备份，并希望是最后一次)。我们要进行开发工作了，建一个目录，叫什么呢，就叫worktmp吧。我们进到此目录下，执行命令cvs checkout netants，我们将会看到如下的信息：cvs checkout: Updating netants U netants/Makefile U netants/http.c U netants/http.h U netants/netants.c U netants/netants.h　CVS在当前目录下建立一个叫做netants的目录，我们原先的代码文件都在这个目录下出现了，而且还多了一个名为CVS的目录。目录CVS下面存放的是一些文本文件，记录了CVSROOT的位置、此项目对应源码库中那个目录等一些信息。<br /><strong>　　3.4保存修改到CVS中<br /></strong>　　　现在，我们开始艰苦卓越的编程工作。经过数十分钟、数小时乃至数天的工作，我们对原有的代码做了较大的修改，现在要告一段落了。我们将修改的内容提交给CVS，于是，我们需要执行命令　cvs commit -m "Made some useful changes on some files"　这时，我们将会看到CVS给出一些提示信息，它扫描并比较此目录下的现有文件和它在源码库中保存的原有文件，做了修改的文件将被更新，并且有了新的版本号：1.2。-m参数如同前面所说，是为了不想它启动一个文本编辑器来让自己输入。如果我们仅是修改了其中一两个文件，我们可以在上面的命令的最后附上文件名，这样CVS只会比较、更新指定的文件。注意的是，和自己做备份不同，CVS只是保存了不同版本之间的差异，并没有完整的保存各个版本。现在，你是不是觉得CVS有点用处了。<br /><strong>　　3.5添加文件到项目中<br /></strong>　　有一天，我们开始考虑给我们的网络蚂蚁加上从ftp站点下载文件的功能，于是，我们需要在原有的项目里添加两个文件：ftp.c和ftp.h。首先，我们在工作目录下建立并编辑、修改、生成了这两个文件，然后我们使用命令add命令来添加。　cvs add ftp.c ftp.h　此时，文件并没有真正的被添加，只是相当于"注册"了一下，要使这个过程生效，我们仍然需要使用commit命令：　cvs commit ftp.c ftp.h -m "Add two files: ftp.c and ftp.h"　此时，CVS将把这两个文件添加到项目中去，他们的版本均为初始的1.1。　　<strong>3.6从项目中删除文件</strong><br />　　除了添加以外，我们有的时候可能需要删除某个文件，例如我们发现文件netants.h其实没有什么用。于是，我们执行下面几个命令来完成删除工作：　rm netants.h　cvs remove netants.h　cvs commit netants.h -m "Delete a file."　要注意的是，CVS只是删除了当前版本的netants.h，它以前的版本依然存在，除非它恰好仅有1.1版本。<br /><strong>　　3.7设定特定版本号　<br /></strong>　　经过一段时间的工作，程序已经初具规模，形成了较稳定的版本。这个时候，netants.c可能已经是5.4版本，而http.c可能是3.5版本，而我们希望将当前的代码作一个版本发布。此时，我们需要使用的是tag命令。这个命令赋予指定的一个或多个文件一个给定的文本形式的版本号。版本号必须以字母开始，可以包含数字、下划线和连接符号(-)。我们想给当前项目的所有文件赋予相同的版本号时，可以不指定文件或路径参数，CVS默认选择当前目录下所有在CVS中注册的文件(循环进子目录)。下面既是一个例子：　键入命令：cvs tag release0-1　提示信息：　　　　cvs tag: Tagging .　　　　T Makefile　　　　T ftp.c　　　　T ftp.h　　　　T http.c　　　　T http.h　　　　T netants.c　这样当前版本的所有文件都有了一个叫做release0-1的版本代号。当我们需要这个版本的时候，我们使用-r (版本代号)参数来得到指定的版本。例如命令：　cvs checkout -r release0-1 netants　将在当前目录下建立netants目录，并导出所有版本代号为release0-1的文件。<br /><strong>　　3.8更新当前工作目录中的文件<br /></strong>　　　这里使用的命令为update，它将比较指定的在CVS源码库中的文件和当前目录下的文件，如果CVS源码库中有更高版本的源文件，则更新当前目录下的文件。这个功能主要是多人协作开发项目时使用的，让你及时分享同伴的工作成果。但它另外一个重要的用途，同样适用于单人开发的项目。这个用途需要使用-j参数，我们看下面的例子：　cvs update -j 1.5 -j 1.3 netants.c　这个命令的功能是，在当前目录的netants.c文件中，忽略从版本1.3到版本1.5所作的修改。毫无疑问，对程序员来说，这是一个非常重要的功能。因为在某个阶段我们对程序所作的修改在现在可能会被视为是无效乃至错误的，这个功能很好的解决了这个问题。　在更新的过程中，CVS执行一个自动合并的过程。例如我们的工作目录中的netants.c文件版本是2.1，并且我们已经对此文件作了一番修改，而CVS源码库中的是版本2.2，此时我们执行update命令时，CVS并不是简单的将版本2.2覆盖版本2.1，而是试图将自版本2.1到版本2.2的修改添加到当前目录中的文件中去，如果它和我们刚刚所作的修改有冲突，则CVS会以字符串"&gt;&gt;&gt;&gt;"表示由冲突发生，期待用户去修改。CVS拒绝接受包含有上述特定字符串的文件。下面即是一个冲突的例子：netants.c:版本号2.2，保存在CVS中……getPartFile( ); showFinished(); return(A); }……<br />　　netants:版本号2.1经过我们的修改……getPartFile( ); return(B); }……我们执行命令cvs update netants.c后，将会包含如下内容的新的netants.c：<br />　　……getPartFile( ); showFinished(); &gt;&gt;&gt;&gt;&gt;&gt; 2.2 }……　除非我们做出修改并删去"&gt;&gt;&gt;&gt;&gt;&gt;"，否则在执行cvs commit的时候，netants.c将不会更新原有的2.2版本。<br /><strong>　　4.CVS的其他功能<br /></strong>　　CVS当然远不止上面所说的这些内容，这些仅是CVS的基本功能，CVS还有许多重要的功能，如上面所说的网络工作方式、支持二进制文件等。下面我们对这些功能作简单的说明。<br /><strong>　　4.1 CVS的网络工作方式　<br /></strong>　　CVS的网络功能采用client-server结构，两地均需安装CVS。CVS采用rsh方式或者口令校验方式进行工作。对client端，同前面讲过的设置环境变量CVSROOT一样，用户需要设置新的环境变量CVS_SERVER，指明CVS在server上的路径，例如：/usr/local/cvsroot1。CVS的-d参数指定路径名，它后面可以用：(local或server或ext)：来指明是在本地还是在异地服务器上，默认当然是在本地，正如我们在初始化CVS一节所使用的那样。下面的命令假定我们的CVS服务器为cvs.rdcps.ac.cn，用户名为crazyyao，CVS源码库在服务器的/usr/local/cvsroot1目录下，我们的工作项目还是netants，我们用rsh方式导出项目文件：　cvs -d : server : crazyyao@cvs.rdcps.ac.cn :/usr/local/cvsroot1 checkout netants　采用口令校验方式时，需要对修改系统文件/etc/inetd.conf，以便使inetd知道如何分配、处理CVS Server的请求和响应。CVS会在源码库所在的目录中创建一个名为passwd的口令文件，对用户进行校验。使用口令校验时，CVS支持匿名登陆，而且CVS项目超级用户可以设置项目中文件的存取权限。　关于如何配置CVS使之工作在网络方式下的详细信息请参考CVS的文档。<br /><strong>　　4.2 CVS的分支和融合功能<br /></strong>　　　CVS增强的目录工作方式使得CVS提供分支和融合功能。有的时候，当项目进展到一定程度时，可能需要暂时中断，去做另外一些修改和发展。例如，我们的软件原有版本为1.0，并已提交用户使用，现在正在开发2.0。某一天，1.0的用户发现了一个较大的bug或者需要添加某个短小的功能，这时我们不能让用户去期待2.0版本，又必须给用户满意的答复，比较理想的解决方式是把现在的工作先放到一边，另开一个分支，去满足用户的需要。当此分支完成后，程序源还可以使用CVS的融合功能将这一部分修改添加到我们开发2.0版本的主工作进程中去。　创建分支可以使用tag -b命令。例如下面的命令　　　cvs tag -b netants-1-0-patch　在当前的工作目录的基础上创建一个叫做netant-1-0-patch的分支。　融合的命令参数是-j，我们在前面已经提及它了。<br /><strong>　　4.3 CVS处理二进制文件的功能　<br /></strong>　　CVS可以保存二进制文件，但和文本文件相比，它的许多功能丧失了。对于文本文件，CVS可以辨别出文件的任何一点改动，但对于二进制文件它无能为力。但是，CVS可以区分出文件作了改动，并会提示用户自己修改、保存。与文本文件不同，CVS保存二进制文件每个版本的完整信息。在操作二进制文件时，需要添加参数-KB，以便告诉CVS不把它当作文本文件看待。<br /><strong>　　4.4 CVS比较文件的功能　<br /></strong>　　执行的命令为diff，这个功能和shell下的diff功能基本一样。例如下面的命令比较CVS源码库中的最新的netants.c文件和当前目录下netants.c文件有什么不同：　cvs diff netatns.c<br /><strong>　　5.结束语<br /></strong>　　通过上面的介绍，希望能激起大家使用CVS的兴趣，并掌握使用CVS的一些基本方法。碰到困难时，别忘了翻阅CVS附带的手册，不过，它有厚厚的172页。希望CVS能加速你的软件开发。</p>
		<br />
<img src ="http://www.blogjava.net/weibogao/aggbug/94195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weibogao/" target="_blank">weibogao</a> 2007-01-16 12:49 <a href="http://www.blogjava.net/weibogao/archive/2007/01/16/94195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WinCVS与CVSNT简明使用手则(二)</title><link>http://www.blogjava.net/weibogao/archive/2007/01/16/94192.html</link><dc:creator>weibogao</dc:creator><author>weibogao</author><pubDate>Tue, 16 Jan 2007 04:43:00 GMT</pubDate><guid>http://www.blogjava.net/weibogao/archive/2007/01/16/94192.html</guid><wfw:comment>http://www.blogjava.net/weibogao/comments/94192.html</wfw:comment><comments>http://www.blogjava.net/weibogao/archive/2007/01/16/94192.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weibogao/comments/commentRss/94192.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weibogao/services/trackbacks/94192.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 5.2    						管理员进行管理演练：														1.         						登陆远程						CVSNT						：														l         						选择						Admin=&gt;Login						菜单，默认设置，						OK						。								...&nbsp;&nbsp;<a href='http://www.blogjava.net/weibogao/archive/2007/01/16/94192.html'>阅读全文</a><img src ="http://www.blogjava.net/weibogao/aggbug/94192.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weibogao/" target="_blank">weibogao</a> 2007-01-16 12:43 <a href="http://www.blogjava.net/weibogao/archive/2007/01/16/94192.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WinCVS与CVSNT简明使用手则(一)</title><link>http://www.blogjava.net/weibogao/archive/2007/01/16/94191.html</link><dc:creator>weibogao</dc:creator><author>weibogao</author><pubDate>Tue, 16 Jan 2007 04:42:00 GMT</pubDate><guid>http://www.blogjava.net/weibogao/archive/2007/01/16/94191.html</guid><wfw:comment>http://www.blogjava.net/weibogao/comments/94191.html</wfw:comment><comments>http://www.blogjava.net/weibogao/archive/2007/01/16/94191.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weibogao/comments/commentRss/94191.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weibogao/services/trackbacks/94191.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1       						前言：														CVS						是版本控制的利器，目前在						Linux						和						Windows						下都有不同版本；但是国内大多数应用介绍都是基于						Linux						等开放源代码的开放性软件组织，而且讲解的也不系统，让人摸不着头脑；						Windows...&nbsp;&nbsp;<a href='http://www.blogjava.net/weibogao/archive/2007/01/16/94191.html'>阅读全文</a><img src ="http://www.blogjava.net/weibogao/aggbug/94191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weibogao/" target="_blank">weibogao</a> 2007-01-16 12:42 <a href="http://www.blogjava.net/weibogao/archive/2007/01/16/94191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《CVSNT用户管理方案》转载</title><link>http://www.blogjava.net/weibogao/archive/2007/01/16/94190.html</link><dc:creator>weibogao</dc:creator><author>weibogao</author><pubDate>Tue, 16 Jan 2007 04:38:00 GMT</pubDate><guid>http://www.blogjava.net/weibogao/archive/2007/01/16/94190.html</guid><wfw:comment>http://www.blogjava.net/weibogao/comments/94190.html</wfw:comment><comments>http://www.blogjava.net/weibogao/archive/2007/01/16/94190.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weibogao/comments/commentRss/94190.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weibogao/services/trackbacks/94190.html</trackback:ping><description><![CDATA[
		<font color="#333333">
				<font face="宋体">   所有这些操作基于的环境和软件版本：WINDOWS2000 Pro、CVSNT2.0.4、WinCVS1.3.9.1Beta9 在前面的介绍CVSNT配合WinCVS进行用户管理的文章中，已经对CVSNT的用户管理，权限分配进行了比较详细的叙述，但是还有一些概念没有交待清楚，在这里，我会根据项目的实际需要，以及自己的一些经验给出一套用户管理、权限管理方案，在看这篇文章之前你最好已经阅读了前面的一篇文章，对用户的增加删除，权限的修改，等等这些操作能够了解，否则，会有一点困难。<br /><b><span lang="EN-US" style="COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">  1、 CVSNT的用户验证方式</span></b></font>
		</font>
		<b>
				<span lang="EN-US" style="COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<br />
				</span>
		</b>
		<span lang="EN-US" style="COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">  我们这里所讨论的是工作在pserver方式下。<br />  在CVSNT的文档中给出了两种验证方式，我总结了一下，可以这样称呼：Window和CVSNT混合验证方式，CVSNT独立验证方式。在前面的文章中，我们没有详细的给出这两种方式的内容，所讲述的启示就是混合验证方式。<br />  决定CVSNT工作于何种验证方式是由CVS的管理文件来决定的，这些管理文件处在库的目录下的CVSROOT目录中，这里可以得出结论，对于不同的库，可以给不同的验证方式。所以，在每个库建立的时候要首先设定好这些前提。<br />  下面的操作如果没有特殊指出则都是在客户端来进行管理的，下面首先是对一些控制原理和相关的文件做一些说明，如果你正在进行相关的模拟操作，请停下来暂时停止你的操作，因为这些操作的步骤是有先后的，如果你顺序不对，那么你可能就权限失效，进行不了下面的操作了。<br /></span>
		<b>
				<span lang="EN-US" style="COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">  1．1 config文件</span>
		</b>
		<b>
				<span lang="EN-US" style="COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<br />
				</span>
		</b>
		<span lang="EN-US" style="COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">  在库建立好了以后，你还没有对控制文件进行修改之前，CVSNT是工作在混合验证方式之下的，这个时候，CVS服务器的管理员就是CVSNT的管理员，你以一个管理员身份登陆，检出你要操作的库的CVSROOT模块，看一下文件列表，控制CVSNT的验证工作方式的是config文件，你可以在文件列表中找到它，双击看看其中的内容，这里对我们最重要的就是第一个设置内容，你会看到下面的内容：<br />  # Set this to `no' if pserver shouldn't check system users/passwords<br />  #SystemAuth=yes<br />  第二行就是我们要修改的内容，默认状态是被注释掉的，SystemAuth有两个值yes和no<br />yes：pserver将使用系统用户数据库和passwd文件（这个文件后面会详细讲述）来共同验证（若passwd文件不存在或者文件中没有相应的资料，则用系统用户来进行验证）默认为yes<br />  no：所有的用户必须在passwd中存在，根据passwd的内容来进行用户的验证。<br />  我这里所阐述的方案就是工作在no的下面的，修改完之后提交到服务器，提交完毕服务器就处在CVSNT的独立验证模式下了。在这个工作方式下，NT本地的用户和CVSNT用户没有任何本质的联系和影响（仅仅是要建立一个别名）。<br /></span>
		<b>
				<span lang="EN-US" style="COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">  1．2 passwd文件</span>
		</b>
		<b>
				<span lang="EN-US" style="COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<br />
				</span>
		</b>
		<span lang="EN-US" style="COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">  在讲述上面的时候提到了这个文件，在服务器工作在CVSNT验证模式下的时候，这个文件就可以称之为CVSNT的用户数据库，这个里面存储着用户列表，用户的密码，以及别名的一些信息。默认状态下这个文件是不存在的，所以，如果我们要在CVSNT验证模式下工作，必须建立这个文件。注意：这个文件是不能够在客户端进行修改的。这个文件的内容是相当简单的，就像下面：<br />  bach:ULtgRLXo7NRxs<br />  spwang:1sOp854gDF3DY<br />  melissa:tGX1fS8sun6rY:pubcvs<br />  qproj:XR4EZcEs0szik:pubcvs<br />  这里分别拿第一个用户bach和第三个用户melissa来进行说明，每一行代表一个用户，总共有三部分信息，用户名、密码、本地用户三部分之间使用冒号“:”来进行分割。<br />  用户名：就是登陆CVS的用户名<br />  密 码：用户的密码，这里是经过加密的，如果为空，那么就是空密码<br />  本地用户：CVS用户这个别名对应的本地用户，（跟本地用户没有任何其他关系，仅仅是别名的关系）<br />  如果在本地系统中存在一个用户名bash，那么要在CVS建立一个bach这样的用户就不需要在后面指出对应的系统用户，melissa后面的pubcvs就是系统用户，在本地系统上面存在的用户。对于要用命令增加这两种用户的格式如下：<br />  cvs passwd –a bach<br />  cvs passwd –r pubcvs –a melissa<br />  在库建立的时候可以在服务器上建立一个简单的passwd初始化文件，加一行<br />  cvsadmin:<br />  这样，就给出了一个cvsadmin这个空密码用户（本地系统中有这样的用户，就可以不加到后面去），然后在客户端来进行修改和以后的用户增加工作。注意：在客户端进行其他之前请先首先修改这个密码，以防止别人进行破坏。<br />  在服务器端建立了这个文件以后，就不用再手动进行修改了，当你在客户端进行密码或者用户的增加删除的时候，系统会自动进行这个文件的更新。这个文件是管理着CVSNT系统中的所有的用户，所以，要特别重视，不了解这个文件格式的，不要去随便修改，更加不要尝试在客户端进行修改！<br /></span>
		<b>
				<span lang="EN-US" style="COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">  1．3 admin文件</span>
		</b>
		<b>
				<span lang="EN-US" style="COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<br />
				</span>
		</b>
		<span lang="EN-US" style="COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">  这个文件是指定CVSNT的管理员列表的文件，CVSNT会根据这个文件中的内容来判断一个用户是否是管理员。这个文件的内容很简单，是一个用户列表。类似下面<br />  user1<br />  user2<br />  user3<br />  这些代表user1,user2,user3都是管理员，当然，这些用户必须要存在才能够正确登陆系统来执行管理。<br />  这个文件默认状态下是没有的，但是，可以在客户端进行添加，在你的客户端进行新建这个文件然后add上去再commit一下，这个文件就可以上传到服务器，但是这个时候还没有生效，请修改checkoutlist这个文件，加入admin这一行，checkoutlist也可以在客户端进行修改再提交，这个时候admin就可以被系统自动的build了。<br />  Checkoutlist是维护的一个文件列表，可以放入系统自动build的用户自定义的系统文件列表，注意：对passwd没有用！！<br /></span>
		<b>
				<span lang="EN-US" style="COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">  1．4 group文件</span>
		</b>
		<b>
				<span lang="EN-US" style="COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<br />
				</span>
		</b>
		<span lang="EN-US" style="COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">  这个文件是定义系统的组，我们可以将同样性质的用户归入一个组，然后用给用户赋权限的方式给组赋权限，这样，一个组的用户就会具有同样的权限。Group的内容如下：<br />  group1:user1 user2 user3<br />  group2:me you he<br />  group3:tom honey<br />  有上面可以看出来，这个文件的内容也是相当的简单，首先是组的名称然后是冒号，接着是用户名，多个用户名之间用空格来进行分割。<br />  Group文件可以在客户端进行新建和修改，不用修改checkoutlist这个文件，系统会自动build这个文件并且使之生效。<br />  作为组里面的特定成员还可以赋给特定的权限，权限分为两类c,w,r和n，否定权限是有高的优先级的。<br />  好，上面已经介绍了本方案所涉及到的几个重要的文件以及修改方式。这里再强调一下，passwd只能够再服务器端进行建立和修改，不能够在客户端进行操作！<br />现在根据上面介绍的内容，可以开始你的操作了，下面给出修改顺序，库刚刚建立起来的时候，使用一个服务器上的本地管理员用户进行登陆检出CVSROOT模块。<br />  1、 现在服务器端加上passwd文件，给一个初始的用户，比如cvsadmin:<br />  2、 在客户端增加admin，将cvsadmin加入admin文件，作为出是管理员，并提交加入到库中。<br />  3、 在修改checkoutlist文件，加入admin，使其能够自动build。<br />  4、 最后修改config文件的SystemAuth=no，在提交之前要确认一下你上面的修改是否正确，如果提交了这个文件，CVSNT验证模式就开始生效了！<br />  5、 好，现在请修改你的参数再重新进行的登陆吧。因为你的系统已经切换了工作模式，你当前的用户已经失效了。<br />  完成了上面的步骤，整个服务器就会有效的工作在CVSNT验证模式下了。而group文件在你需要的任何时候可以加入。<br />  在上面的文章关于CVSNT的用户的管理方案的，在这里做一点补充，在后面的操作中全部是针对在客户端使用WinCVS来进行的（出了增加passwd）文件，其实，在我的实践当中config，passwd，admin，checkoutlist，这些文件的起始修改（初始化）都可以在新建了库以后一起完成，然后再让相应的库的管理员来进行相关的操作。<br /></span>
<img src ="http://www.blogjava.net/weibogao/aggbug/94190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weibogao/" target="_blank">weibogao</a> 2007-01-16 12:38 <a href="http://www.blogjava.net/weibogao/archive/2007/01/16/94190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>