UML软件工程组织

版本控制的利器——CVS(在Windows环境下使用CVS)
来源:为石软件 作者:Manson
1. CVS简介
2. 安装
   2.1 安装前的准备
   2.2 服务器端的安装
   2.3 本地机安装
3. 配置
   3.1 服务器的配置
   3.2 本地机的配置
4. 使用
   4.1 从服务器下载文件
       4.1.1 查看服务器里有哪些工程模块
       4.1.2 第一次下载新的模块(目录)
       4.1.3 获取文件最新版本
       4.1.4 从服务器恢复文件以前版本
   4.2 把文件增加入服务器
       4.2.1 增加工程模块(Module目录
       4.2.2 在工程里增加一个目录
       4.2.3 增加文件
       4.2.4 文件被错误增加的补救
   4.3 CVS控制下的文件修改
       4.3.1 修改提交
       4.3.2 查看你修改过尚未提交的文件
       4.3.3 文件的不同版本做比较
       4.3.4 写日志和查历史(Log)
    4.4 工程版本的分支
       4.4.1 创建一个分支
       4.4.2 选择一个指定的分支
       4.4.3 返回开发主线
       4.4.4 合并分支
   4.5 删除及移动文件
       4.5.1 删除本机非CVS控制的文件
       4.5.2 删除文件
       4.5.3 删除空的文件夹
       4.5.4 移动文件夹与文件
   4.6 版本发布(固定版本)
5. 操作建议
   5.1 文件冲突
   5.2 避免文件冲突
6. CVS的缺陷
7. 附录
   7.1 cvs update的信息报告
   7.2 cvsroot改变的情况
   7.3 CVS术语:(cvs是Concurrent Versions System的缩写)
   7.4 CVS简介
   7.5 安装
       7.5.1 安装前的准备
       7.5.2 服务器端的安装
       7.5.3 本地机安装
   7.6 配置
       7.6.1 服务器的配置
       7.6.2 本地机的配置
   7.7 使用
       7.7.1 从服务器下载文件
       7.7.2 查看服务器里有哪些工程模块
       7.7.3 第一次下载新的模块(目录)
       7.7.4 获取文件最新版本
       7.7.5 从服务器恢复文件以前版本
       7.7.6 把文件增加入服务器
       7.7.7 增加工程模块(Module目录)
       7.7.8 在工程里增加一个目录
       7.7.9 增加文件
       7.7.10 文件被错误增加的补救
       7.7.11 CVS控制下的文件修改
       7.7.12 修改提交
       7.7.13 查看你修改过尚未提交的文件
       7.7.14 文件的不同版本做比较
       7.7.15 写日志和查历史(Log)
       7.7.16 工程版本的分支
       7.7.17 创建一个分支
       7.7.18 选择一个指定的分支
       7.7.19 返回开发主线
       7.7.20 合并分支
       7.7.21 删除及移动文件
       7.7.22 删除本机非CVS控制的文件
       7.7.23 删除文件
       7.7.24 删除空的文件夹
       7.7.25 移动文件夹与文件
       7.7.26 版本发布(固定版本)
   7.8 操作建议
       7.8.1 文件冲突
       7.8.2 避免文件冲突
   7.9 CVS的缺陷
   7.10 附录
       7.10.1 cvs update的信息报告
       7.10.2 cvsroot改变的情况
       7.10.3 CVS术语:(cvs是Concurrent Versions System的缩写)
1.CVS简介
    CVS 是 Concurrent Versions System 的简称。它是现今 Open Source 成功发展的幕後功臣之一。 CVS 解决多人合作开发时程式版本控管的问题,通常会再搭配邮件列表(Mailing List)做为开发团队沟通的管道。这种组合,使开发团队不受时间地域限制,合作伙伴分散全世界,且团队大小没有上限,因此 Open Source 才能集合世界各地高手,不断地薪火相传、不断地推出高品质的自由软件。他的特点,非常适合团队协同开发模式下源代码、文档的归档、版本追朔,得到了广大专业程序员和配置管理员的认同。
2. 安装
   2.1 安装前的准备
        (CVS软件可在各开源项目下载)
   2.2 服务器端的安装
       在服务器上安装CVSNT服务器
   2.3 本地机安装
       在本地机安装WinCvs13b13客户端
3. 配置
   3.1 服务器的配置
       进入Repositories选项,在Repository root里ADD设置服务器的文件储存路径(例:d:\cvsroot ) 然后开启服务
   3.2 本地机的配置
       首先设置ADMIN菜单的WinCvs Preferences,

    General选项:

        Authenticatio选择PSERVER(即是使用客户端 CVS协议连接到远程CVS服务器) PATH填上CVS服务器存储路径,(例如: d:\cvsroot )Host address填服务器名[servername] User name填好登陆服务器的名字(在名字后面加上冒号和你登陆服务器的密码,那样下次登陆时就不再提示输入密码了,不然每次操作都必须登陆LOGIN输入密码)


Globles选项:
    Prune(remove)empty directories此选项的意思是工具会自动帮你清除空文件夹

CVS选项:
   在HOME里设置本地机工作路径(如: d:\cvslocal )
设好路径后,但在工具的界面上还未能看到你的工作目录,
这时要在VIEW菜单下的Browse Location选Change设置查看你的工作目录(就是你刚才设置的工作目录d:\cvslocal),

这样就能看到你的工作目录了。这样CVS客户端就设置完成了。
4. 使用
   注意事项:
       在CVS里的文件只许增不许减,而且文件不允许改名,所以在CVS里加入文件时要格外注意,还要注意文件的命名规范。
   4.1 从服务器下载文件
   4.1.1 查看服务器里有哪些工程模块
       在Admin菜单下的Admin macros选项里,点选List Module Contents ;那就可以查看到服务器里所有的工程模块Module名了。那你才可以知道应该选择和决定去下载哪个Module了。

    如果你想先查看Module底下的目录,你可以在命令行里输入cvs ls [options] 这是你想查的Module名,这样就可以把你的Module详细目录列出来了。


   4.1.2 第一次下载新的模块(目录)
       决定了需要下的Module名,就可以在Remote菜单下的Checkout Module选项在Module name and path填入你想从服务器上下载回本机的工程文件夹(Module)模块名称。

   4.1.3 获取文件最新版本

       如果工程模块已经Checkout Module一次到了本机了,那要获取最新版本,并不是每次都要Checkout Module, 只要右键目的文件夹,选Updata selection,在Updata settings 里钩选Create missing directories that exist in…这样就可以获取GET到最新的版本了(包括文件夹)。


   4.1.4 从服务器恢复文件以前版本
   4.1.4.1 根据时间来恢复文件夹或文件的版本
       右键点选需要恢复的文件夹或文件,选择update selection,在update options 里面选择Before date项,输入版本日期时间根据时间来恢复版本(在这下拉框里有提供默认的日期时间格式,可以根据所给的格式来修改);

   4.1.4.2 恢复文件到指定的版本
       右键点选需要恢复的文件选择retrieve rev./tag/branch 中输入你想恢复的版本号(如: 1.2 )。这样就可以恢复到你需要的版本了。

   4.2 把文件增加入服务器
       属于CVS控制下的文件会在Status有标明(File\Binary),如果还没加入CVS的新文件就会标明是(NonCvs file)

   4.2.1 增加工程模块(Module目录)
       这里指的是增加一个工程的顶极目录,点中目的工程文件夹,选择Remote菜单下的Import Module;把Import Module选项卡里Import Options的Create CVS directories while importing选中,这样就可以把整个模块目录增加入了。

   4.2.2 在工程里增加一个目录
       选中你需要增加的目录,然后选Macros――CVS菜单,选Recursive Add(auto-commit)递归增加选项;这样就可以整个目录地增加了,而且还会自动按照文件原本类型去分类增加。 (请大家在增加目录之前,注意目录的命名规范,并检查一下是否已经有同事建立了同名的或者相同作用的目录,所以建议大家能勤快点update)

   如下图,系统自动识别出你的各种文件类型,你还可以手动去修改,这里请注意不要选择Auto-commit的选项,因为很多时候不能够顺利自动提交会导致停止,所以避免出现意外,请在文件添加完后再手动提交。

   4.2.3 增加文件

       点选需要增加的文件,根据不同编码的文件(普通文件 File)(二进制binary 如:word文件和excel文件还有图片就是属二进制的),去选择跟文件类型符合的加入方法。等ADD完后,文件显示为红色,这时把文件按右键将它commit就行了。
   4.2.4 文件被错误增加的补救
       有些时候在增加文件时,不小心把文件的类型格式搞错(如图片文件是属于Binary的被当作File来增加)。如果你已经提交了,只好联系管理员帮忙解决了;但是在你提交之前及时发现了错误,其实这时文件还未被增加入服务器,还有办法补救去修改你的文件类型。首先,你先把你的文件做好备份,然后将那些错误文件(那些显示为红色的等待提交的文件)删除,再把备份的文件拿来重新正确地增加提交,问题解决。
   4.3 CVS控制下的文件修改

   4.3.1修改提交
       在CVS里修改文件不需先前将文件CHECKOUT, 直接对文件修改就行,改完后你会发现在CVS下你的文件变成了红色,并标记为Mod.File; 这时候你需要commit它(即CHECKIN提交)
   4.3.2 查看你修改过尚未提交的文件
       有时候工作起来,文件这里改改那里改改很混乱,到提交时都不知道自己修改过了那些文件,这样点选目标工作文件夹,选Macros--Tcl--Fast search modified; 就可以列出你所有修改过的文件了。

   4.3.3 文件的不同版本做比较
   4.3.3.1 cvs里默认的文件比较方法
       在使用Cvs时经常需要比较一下相同文件的不同版本,找出其中的修改之处,如果人为检查,不但费时还不一定能看出所有的差别。只需在选中文件后,选择“Query”菜单项的“Diff selection”,然后选择是将本地文件与Cvs服务器的最新版本进行比较,还是和服务器上的其它版本进行比较,或是比较两个指定版本或标签的文件。确定后,系统将在output窗口输出两者的区别。
   4.3.3.2 利用WinMerge作为CVS的比较工具
       先安装好WinMerge ,然后打开Admin—Preferences设置菜单,

   选到WinCvs选项卡,构选Programs下的External diff pro选项,设置外部对比工具WinMerge的路径。

   右击目的文件,选择Diff selection

   设置Diff settings , 设置Compare框为:Local copy against another revision/tag/branch… (意思是对这文件作指定版本的比较);设置Revision or date (意思是指定文件的版本或日期等);如果是第一次使用外部对比工具,那记得先要把Use the external di …钩选上,这样就可以用WinMerge来比较文件了。

   4.3.4 写日志和查历史(Log)
      l 无论何时你都应该在提交文件时加上日志信息。(在commit提交窗口里写上你的message)
      l 那你以后就可以点选Log selected按钮来查看CVS文件的版本历史信息(如它是怎样被改变的,以及什么时候、被什么人改变等)。
      l 右键菜单中选择"status selection"可查看文件的状态。
      l 右键文件,点按(Graph selection…),使用默认设置,就可以得到该文件所有版本的图形结构描述。
   4.4 工程版本的分支
      CVS允许你修改代码到不同的开发线上,即隔离到一个分离的开发线上,这就是分支(branch)。当你改变一个分支中的文件时,这些更改不会出现在主开发主干(main trunk)和其它分支中。
   4.4.1 创建一个分支
      l 选择你要分支的目录或文件,
      l 选菜单Modify—Create a branch;
      l 在new branch name里输入你要创建的分支的名称标记。
      l 在创建之前一定要记得点选Check that the files are unmodified before branching的选项,这样在创建分支之前会先检查确保你的文件没被别人正在修改。
   4.4.2 选择一个指定的分支
      l 选择工程顶级目录(如果你准确知道分支内的目录和文件,也可以分别选择)
      l 在选择上点击右键,选择Updat selection更新菜单
      l 并且把Create missing directories that exist in the repository选中
      l 选择Sticky options里的Retrieve rev./tag/branch选项
      l 在Retrieve rev./tag/branch输入框里输入你想切换到的分支名称标记
      l 点OK,那WINCVS就会作需要的更新,把属于这个分支的所有文件都更新到本机,不属于这个分支的文件将会删除。
   4.4.3 返回开发主线
      如果你想停止分支上的工作,将本地的工作转回到开发主线上,你要通过WINCVS删除所有的分支标签。执行以下操作返回开发主线:
      l 选择工程顶级目录(如果你准确知道分支内的目录和文件,也可以分别选择)
      l 在选择上点击右键,选择Updat selection更新菜单

      l 并且把Create missing directories that exist in the repository选中
      l 选中Reset any sticky date/tag/’-k’ options ;

      l 点OK,那WINCVS就会更新你的本地文件,以使符合当前的开发主线。曾经工作的分支仍然存在。你还可以随时又选择返回到你的分支上工作。
   4.4.4 合并分支
      合并不同分支(版本)的文件(merge)在update文件时,第三个tab就是合并选项。也即合并文件是通过update来进行的。如下,说明了几种合并方式。

   如上图设置,将v_ds版本覆盖为v_xj 。

   如上图设置,将v_ds版本与当前版本比较合并,将only this reg./tag 中指定的版本与当前版本进行合并,通常会有冲突发生。
例如:    
v_xj 为当前版本,文件内容为:    
 --xj    
 xj    
 v_ds文件内容为:    
 ds before merge --ds    
 now it become the file of ds    
 I want to merge agagin    
 按上图设置合并版本,会显示文件冲突,打开文件如下:    
 <<<<<<< test.txt    
 --xj    
 xj    
 =======    
 ds before merge --ds   
  now it become the file of ds    
 I want to merge agagin    
 >>>>>>> 1.1.4.4    
 在这里,ds版本的文件比当前的xj版多出了一行,在合并时不能一行行对应合并,会显示文件冲突,将cvs添加的冲突标识符删除去掉后,并把文件修改正确,然后commit即可。这样就合并分支了。
   4.5 删除及移动文件
   4.5.1 删除本机非CVS控制的文件
      点选目标文件夹,点选Macros—>Tcl—>List non-CVS files ; 就列出查看所有非CVS的文件了。

      有些特殊时候需要把工作目录底下所有的没用的非CVS的文件删除掉(请使用此功能之前千万要谨慎,建议先查看所有非CVS文件,确定你的文件真的全部是没用的,如果你有些是属于重要文件,只是忘记提交的,那被误删除后你可就要后悔了),点选目标文件夹,选择Macros菜单Tcl选项下的Remove non-CVS file ;就可以清除。

   4.5.2 删除文件
       点选你需要删除的文件,点Modify--Romove菜单,然后文件会标记为Removed, 这时 commit它就行了(这样别人Updata的时候就见不到这文件的了);如果你想改变主意不想删除文件,那你就把这标记为Removed的文件ADD回去,那样就可以放弃当前的删除操作。

   4.5.3 删除空的文件夹
      l 选择你要删除的空文件夹的父目录文件夹
      l 右键选Update selection更新菜单
      l 选Globals项
      l 钩选Prune(remove) empty directories; 清除空的文件夹(此项是却省项)

   4.5.4 移动文件夹与文件
       有时候会发现文件夹或文件的存放目录不理想,想将文件转移位置,那应该注意一点,明白到由CVS服务器管理的文件夹里,会有个隐藏的“CVS”文件夹,这个隐藏的文件夹是CVS服务器的记录文件,里面会记录着你的文件目录路径等相关的信息。也就是说,即使你把你其中一个文件夹移到一旁,CVS仍然会认识它,这些文件还会根据“CVS”记录文件里的路径去执行操作。这里有个容易出错的地方,当你就这样去移动文件夹时,在你的本机上就会出现个假象,其实文件并没有成功地转移,其他的团队成员是无法按照你理想的目录路径去取得这些文件夹的。
   正确的操作步骤应该是:首先将你想移动的文件夹拷贝到目的地,然后搜索此目录里的“CVS”文件,并且全部删除;最后把这些文件当作是新文件地加入库并提交。至于那些旧路径的旧文件,可以请管理员去帮忙删除。
   4.6 版本发布(固定版本)
       经过一段时间修改,各个文件的版本不一致,而且文档管理到了一个阶段,或者版本该发布了,则需要固定版本发布版本。

   以下操作把所有工程文件都统一为2.0版本:

   当版本发布之后,版本已经固定(锁定)了,如果你还需要继续在此版本上工作的话,你就需要对你这个锁定版本的文件解锁(即返回开发主线继续开发――参考3.4.3返回开发主线)。
5. 操作建议
   5.1 文件冲突
       CVS操作原理和VSS没什么分别,只是在CVS里没有象VSS那样CHECKOUT的修改权限限制,人人都可以修改文件,如果两个人同时在修改同一个版本的文件(几个人在同一时间修改同一个文件几乎很少发生,CVS通常能够智能地合并他们的修改),但如果两个或更多的开发人员在修改了相同的几行代码,那这时CVS就会报告冲突,用户就会收到提示,这时就需要大家讨论这个文件该如何解决,到底是使用哪个人的版本,还是把两人的工作合并,最后决定出一个最终版本。
   5.2 避免文件冲突
       大家开发人员之间应该多点工作交流,就可以避免两个人同时去修改同一个文件的问题,就可以避免文件冲突发生;
还有建议大家每次修改文件时,都务必先Update 一下,获取一下文件的最新版本,这样来使用,也可以避免出现冲突的麻烦。
6. CVS的缺陷
    CVS也有不足的地方,在长期的使用中,我们认为CVS主要存在以下不足
      ¨ 管理和使用对初学者有一定难度,不易上手
      ¨ 目录不受版本控制,不利于大规模项目的完整控制
      ¨ 对于并发程度较高的模块,多人同时更新情况下,文件的合并操作不易完成
   新近推出的SVN,继承了CVS的大部分优点,也特别针对目录控制等进行了专门的控制,期待SVN能给版本控制带来更多的效率。
7. 附录
   7.1 cvs update的信息报告
       "cvs update" 后在信息框里会列出你的操作,你的文件update的情况,这里是CVS使用的所有其它单字符信息性消息的列表:
      U [path] 在本地机更新get到了服务器上最新的或者最新版本的文件。
      P [path] 像“U”一样,只是在update时你的网络带宽少的情况下CVS服务器所出现的提示。
      M [path] 这意味着您已经修改过该文件了;而且,有可能资源库中新的更改已成功地合并到该文件。
      C [path] 错误警报,"C" 字符表明该文件存在冲突,需要在使用 "commit" 提交前解决这冲突。
      A [path] 该文件是计划要添加的,即添加了但尚未提交,这时你还使用update命令,CVS就会有这个提示,当你 "commit" 时,它被正式添加到服务器库中,问题解决。
      R [path] 象 "A" 一样,"R" 让您知道该文件计划要删除的,即删除了但尚未提交,这时你还使用update命令, CVS就会有这个提示,当你 " commit" 后,该文件就会从服务器库中删除,问题解决。
   7.2 cvsroot改变的情况
       服务器端操作:有些特殊情况需要更换或者是转移CVS服务器的, 这样只需要拷贝CVS服务器底下的cvsroot里的各个工程Module文件夹就可以了。
   客户端的操作:需要设置客户端的工程文件,更改为新服务器的信息,能与新服务器连接就可以继续工作了。
   如下图,先选中你需要修改cvsroot的工程Module文件夹,然后选择Macros—CVS下的Change CVSROOT菜单:

   接着会弹出一个(如下图)的信息框,会显示出你的这个工程文件夹目前(也就是指旧的)的CVSROOT信息,请检查并确定是与你信息吻合。

   接着(如下图)框中输入你要修改的新的CVSROOT,这样CVSROOT就改好了。

   这样你原先在本地机上的CVS工作文件就可以继续使用了。
   7.3 CVS术语:(cvs是Concurrent Versions System的缩写)
      1、 Repository-----仓库: CVS服务器的根目录。模块(Module)的集合
      2、 Module---------模块:,CVS服务器根目录下的第一级子目录。通常用于存放一个项目的所有文件
      3、 Checkout-------检出: 通常指将仓库中的一整个模块首次导出到本地。
      4、 Import----------导入:通常指通过提交整个目录结构并创建一个新的模块。
      5、 Release----------发行版本:整个产品的版本
      6、 Revision--------修订版:单个文件的版本
      7、 Tag--------------标签:在一个开发的特定期对一个文件集给定的符号名
      8、 Update----------更新:从模块中下载其他人的修改过的文件。更新本地的拷贝。
      9、 Commit---------提交:将自己修改过的文件提交到模块中。
   7.4 CVS简介
       CVS 是 Concurrent Versions System 的简称。它是现今 Open Source 成功发展的幕後功臣之一。 CVS 解决多人合作开发时程式版本控管的问题,通常会再搭配邮件列表(Mailing List)做为开发团队沟通的管道。这种组合,使开发团队不受时间地域限制,合作伙伴分散全世界,且团队大小没有上限,因此 Open Source 才能集合世界各地高手,不断地薪火相传、不断地推出高品质的自由软件。他的特点,非常适合团队协同开发模式下源代码、文档的归档、版本追朔,得到了广大专业程序员的认同。
   7.5 安装
      7.5.1 安装前的准备
          (CVS软件可在各开源项目下载)
      7.5.2 服务器端的安装
          在服务器上安装CVSNT服务器
      7.5.3 本地机安装
          在本地机安装WinCvs13b13客户端
   7.6 配置
      7.6.1 服务器的配置
          进入Repositories选项,在Repository root里ADD设置服务器的文件储存路径 (例:d:\cvsroot )
    然后开启服务
      7.6.2 本地机的配置
          首先设置ADMIN菜单的WinCvs Preferences,

   General选项:
       Authenticatio选择PSERVER(即是使用客户端 CVS协议连接到远程CVS服务器) PATH填上CVS服务器存储路径,(例如: d:\cvsroot )
Host address填服务器名[servername]
User name填好登陆服务器的名字(在名字后面加上冒号和你登陆服务器的密码,那样下次登陆时就不再提示输入密码了,不然每次操作都必须登陆LOGIN输入密码)

   Globles选项:
      Prune(remove)empty directories此选项的意思是工具会自动帮你清除空文件夹

   CVS选项:
      在HOME里设置本地机工作路径(如: d:\cvslocal )
   设好路径后,但在工具的界面上还未能看到你的工作目录,这时要在VIEW菜单下的Browse Location选Change设置查看你的工作目录(就是你刚才设置的工作目录d:\cvslocal),

这样就能看到你的工作目录了。这样CVS客户端就设置完成了。
   7.7 使用
      注意事项:
         在CVS里的文件只许增不许减,而且文件不允许改名,所以在CVS里加入文件时要格外注意,还要注意文件的命名规范。
      7.7.1 从服务器下载文件
      7.7.2 查看服务器里有哪些工程模块
         在Admin菜单下的Admin macros选项里,点选List Module Contents ;那就可以查看到服务器里所有的工程模块Module名了。那你才可以知道应该选择和决定去下载哪个Module了。

   如果你想先查看Module底下的目录,你可以在命令行里输入cvs ls [options] 这是你想查的Module名,这样就可以把你的Module详细目录列出来了。

      7.7.3 第一次下载新的模块(目录)
决定了需要下的Module名,就可以在Remote菜单下的Checkout Module选项在Module name and path填入你想从服务器上下载回本机的工程文件夹(Module)模块名称

   7.7.4 获取文件最新版本

      如果工程模块已经Checkout Module一次到了本机了,那要获取最新版本,并不是每次都要Checkout Module, 只要右键目的文件夹,选Updata selection,在Updata settings 里钩选Create missing directories that exist in… 这样就可以获取GET到最新的版本了(包括文件夹)。

      7.7.5 从服务器恢复文件以前版本
         7.7.5.1 根据时间来恢复文件夹或文件的版本
右键点选需要恢复的文件夹或文件,选择update selection,在update options 里面选择Before date项,输入版本日期时间根据时间来恢复版本(在这下拉框里有提供默认的日期时间格式,可以根据所给的格式来修改);

         7.7.5.2 恢复文件到指定的版本
右键点选需要恢复的文件选择retrieve rev./tag/branch 中输入你想恢复的版本号(如: 1.2 )。这样就可以恢复到你需要的版本了。

      7.7.6 把文件增加入服务器
         属于CVS控制下的文件会在Status有标明(File\Binary),如果还没加入CVS的新文件就会标明是(NonCvs file)

      7.7.7 增加工程模块(Module目录)
         这里指的是增加一个工程的顶极目录,点中目的工程文件夹,选择Remote菜单下的Import Module; 把Import Module选项卡里Import Options的Create CVS directories while importing选中,这样就可以把整个模块目录增加入了。

    7.7.8 在工程里增加一个目录
      选中你需要增加的目录,然后选Macros――CVS菜单,选Recursive Add(auto-commit)递归增加选项;这样就可以整个目录地增加了,而且还会自动按照文件原本类型去分类增加。 (请大家在增加目录之前,注意目录的命名规范,并检查一下是否已经有同事建立了同名的或者相同作用的目录,所以建议大家能勤快点update)

   如下图,系统自动识别出你的各种文件类型,你还可以手动去修改,这里请注意不要选择Auto-commit的选项,因为很多时候不能够顺利自动提交会导致停止,所以避免出现意外,请在文件添加完后再手动提交。

      7.7.9 增加文件

   点选需要增加的文件,根据不同编码的文件(普通文件 File)(二进制binary 如:word文件和excel文件还有图片就是属二进制的),去选择跟文件类型符合的加入方法。等ADD完后,文件显示为红色,这时把文件按右键将它commit就行了。
      7.7.10 文件被错误增加的补救
         有些时候在增加文件时,不小心把文件的类型格式搞错(如图片文件是属于Binary的被当作File来增加)。如果你已经提交了,只好联系管理员帮忙解决了;但是在你提交之前及时发现了错误,其实这时文件还未被增加入服务器,还有办法补救去修改你的文件类型。首先,你先把你的文件做好备份,然后将那些错误文件(那些显示为红色的等待提交的文件)删除,再把备份的文件拿来重新正确地增加提交,问题解决。
      7.7.11 CVS控制下的文件修改

      7.7.12 修改提交
         在CVS里修改文件不需先前将文件CHECKOUT, 直接对文件修改就行,改完后你会发现在CVS下你的文件变成了红色,并标记为Mod.File; 这时候你需要commit它(即CHECKIN提交)
      7.7.13 查看你修改过尚未提交的文件
         有时候工作起来,文件这里改改那里改改很混乱,到提交时都不知道自己修改过了那些文件,这样点选目标工作文件夹,选Macros--Tcl--Fast search modified; 就可以列出你所有修改过的文件了。

      7.7.14 文件的不同版本做比较
         7.7.14.1 cvs里默认的文件比较方法
            在使用Cvs时经常需要比较一下相同文件的不同版本,找出其中的修改之处,如果人为检查,不但费时还不一定能看出所有的差别。只需在选中文件后,选择“Query”菜单项的“Diff selection”,然后选择是将本地文件与Cvs服务器的最新版本进行比较,还是和服务器上的其它版本进行比较,或是比较两个指定版本或标签的文件。确定后,系统将在output窗口输出两者的区别。
         7.7.14.2 利用WinMerge作为CVS的比较工具
            先安装好WinMerge ,然后打开Admin—Preferences设置菜单,

   选到WinCvs选项卡,构选Programs下的External diff pro选项,设置外部对比工具WinMerge的路径。

   右击目的文件,选择Diff selection

   设置Diff settings , 设置Compare框为:Local copy against another revision/tag/branch… (意思是对这文件作指定版本的比较);设置Revision or date (意思是指定文件的版本或日期等);如果是第一次使用外部对比工具,那记得先要把Use the external di …钩选上,这样就可以用WinMerge来比较文件了。

      7.7.15 写日志和查历史(Log)
         l 无论何时你都应该在提交文件时加上日志信息。(在commit提交窗口里写上你的message)
         l 那你以后就可以点选Log selected按钮来查看CVS文件的版本历史信息(如它是怎样被改变的,以及什么时候、被什么人改变等)。
         l 右键菜单中选择"status selection"可查看文件的状态。
         l 右键文件,点按(Graph selection…),使用默认设置,就可以得到该文件所有版本的图形结构描述。
      7.7.16 工程版本的分支
         CVS允许你修改代码到不同的开发线上,即隔离到一个分离的开发线上,这就是分支(branch)。当你改变一个分支中的文件时,这些更改不会出现在主开发主干(main trunk)和其它分支中。
      7.7.17 创建一个分支
         l 选择你要分支的目录或文件,
         l 选菜单Modify—Create a branch;
         l 在new branch name里输入你要创建的分支的名称标记。
         l 在创建之前一定要记得点选Check that the files are unmodified before branching的选项,这样在创建分支之前会先检查确保你的文件没被别人正在修改。
      7.7.18 选择一个指定的分支
         l 选择工程顶级目录(如果你准确知道分支内的目录和文件,也可以分别选择)
         l 在选择上点击右键,选择Updat selection更新菜单
         l 并且把Create missing directories that exist in the repository选中
         l 选择Sticky options里的Retrieve rev./tag/branch选项
         l 在Retrieve rev./tag/branch输入框里输入你想切换到的分支名称标记
         l 点OK,那WINCVS就会作需要的更新,把属于这个分支的所有文件都更新到本机,不属于这个分支的文件将会删除。
      7.7.19 返回开发主线
         如果你想停止分支上的工作,将本地的工作转回到开发主线上,你要通过WINCVS删除所有的分支标签。执行以下操作返回开发主线:
         l 选择工程顶级目录(如果你准确知道分支内的目录和文件,也可以分别选择)
         l 在选择上点击右键,选择Updat selection更新菜单

         l 并且把Create missing directories that exist in the repository选中
         l 选中Reset any sticky date/tag/’-k’ options ;

         l 点OK,那WINCVS就会更新你的本地文件,以使符合当前的开发主线。曾经工作的分支仍然存在。你还可以随时又选择返回到你的分支上工作。
      7.7.20 合并分支
         合并不同分支(版本)的文件(merge)在update文件时,第三个tab就是合并选项。也即合并文件是通过update来进行的。如下,说明了几种合并方式。

  如上图设置,将v_ds版本覆盖为v_xj 。

  如上图设置,将v_ds版本与当前版本比较合并,将only this reg./tag 中指定的版本与当前版本进行合并,通常会有冲突发生。
例如:   
v_xj 为当前版本,文件内容为:   
 --xj   
xj   
 v_ds文件内容为:   
 ds before merge --ds   
now it become the file of ds    
 I want to merge agagin    
 按上图设置合并版本,会显示文件冲突,打开文件如下:   
 <<<<<<< test.txt    
 --xj    
 xj    
 =======    
 ds before merge --ds    
 now it become the file of ds    
 I want to merge agagin    
 >>>>>>> 1.1.4.4    
 在这里,ds版本的文件比当前的xj版多出了一行,在合并时不能一行行对应合并,会显示文件冲突,将cvs添加的冲突标识符删除去掉后,并把文件修改正确,然后commit即可。这样就合并分支了。
    7.7.21 删除及移动文件
    7.7.22 删除本机非CVS控制的文件
      点选目标文件夹,点选Macros—>Tcl—>List non-CVS files ; 就列出查看所有非CVS的文件了。

  有些特殊时候需要把工作目录底下所有的没用的非CVS的文件删除掉(请使用此功能之前千万要谨慎,建议先查看所有非CVS文件,确定你的文件真的全部是没用的,如果你有些是属于重要文件,只是忘记提交的,那被误删除后你可就要后悔了),点选目标文件夹,选择Macros菜单Tcl选项下的Remove non-CVS file ;就可以清除。

    7.7.23 删除文件
      点选你需要删除的文件,点Modify--Romove菜单,然后文件会标记为Removed, 这时 commit它就行了(这样别人Updata的时候就见不到这文件的了);如果你想改变主意不想删除文件,那你就把这标记为Removed的文件ADD回去,那样就可以放弃当前的删除操作。

  7.7.24 删除空的文件夹
    l 选择你要删除的空文件夹的父目录文件夹
    l 右键选Update selection更新菜单
    l 选Globals项
    l 钩选Prune(remove) empty directories; 清除空的文件夹(此项是却省项)

    7.7.25 移动文件夹与文件
      有时候会发现文件夹或文件的存放目录不理想,想将文件转移位置,那应该注意一点,明白到由CVS服务器管理的文件夹里,会有个隐藏的“CVS”文件夹,这个隐藏的文件夹是CVS服务器的记录文件,里面会记录着你的文件目录路径等相关的信息。也就是说,即使你把你其中一个文件夹移到一旁,CVS仍然会认识它,这些文件还会根据“CVS”记录文件里的路径去执行操作。这里有个容易出错的地方,当你就这样去移动文件夹时,在你的本机上就会出现个假象,其实文件并没有成功地转移,其他的团队成员是无法按照你理想的目录路径去取得这些文件夹的。
      正确的操作步骤应该是:首先将你想移动的文件夹拷贝到目的地,然后搜索此目录里的“CVS”文件,并且全部删除;最后把这些文件当作是新文件地加入库并提交。至于那些旧路径的旧文件,可以请管理员去帮忙删除。
    7.7.26 版本发布(固定版本)
      经过一段时间修改,各个文件的版本不一致,而且文档管理到了一个阶段,或者版本该发布了,则需要固定版本发布版本。

  以下操作把所有工程文件都统一为2.0版本:

  当版本发布之后,版本已经固定(锁定)了,如果你还需要继续在此版本上工作的话,你就需要对你这个锁定版本的文件解锁(即返回开发主线继续开发――参考3.4.3返回开发主线)。
  7.8 操作建议
    7.8.1 文件冲突
      CVS操作原理和VSS没什么分别,只是在CVS里没有象VSS那样CHECKOUT的修改权限限制,人人都可以修改文件,如果两个人同时在修改同一个版本的文件(几个人在同一时间修改同一个文件几乎很少发生,CVS通常能够智能地合并他们的修改),但如果两个或更多的开发人员在修改了相同的几行代码,那这时CVS就会报告冲突,用户就会收到提示,这时就需要大家讨论这个文件该如何解决,到底是使用哪个人的版本,还是把两人的工作合并,最后决定出一个最终版本。
    7.8.2 避免文件冲突
      大家开发人员之间应该多点工作交流,就可以避免两个人同时去修改同一个文件的问题,就可以避免文件冲突发生;
还有建议大家每次修改文件时,都务必先Update 一下,获取一下文件的最新版本,这样来使用,也可以避免出现冲突的麻烦。
  7.9 CVS的缺陷
    CVS也有不足的地方,在长期的使用中,我们认为CVS主要存在以下不足
      ¨ 管理和使用对初学者有一定难度,不易上手
      ¨ 目录不受版本控制,不利于大规模项目的完整控制
      ¨ 对于并发程度较高的模块,多人同时更新情况下,文件的合并操作不易完成
  新近推出的SVN,继承了CVS的大部分优点,也特别针对目录控制等进行了专门的控制,期待SVN能给版本控制带来更多的效率。
  7.10 附录
    7.10.1 cvs update的信息报告
      "cvs update" 后在信息框里会列出你的操作,你的文件update的情况,这里是CVS使用的所有其它单字符信息性消息的列表:
      U [path] 在本地机更新get到了服务器上最新的或者最新版本的文件。
      P [path] 像“U”一样,只是在update时你的网络带宽少的情况下CVS服务器所出现的提示。
      M [path] 这意味着您已经修改过该文件了;而且,有可能资源库中新的更改已成功地合并到该文件。
      C [path] 错误警报,"C" 字符表明该文件存在冲突,需要在使用 "commit" 提交前解决这冲突。
      A [path] 该文件是计划要添加的,即添加了但尚未提交,这时你还使用update命令,CVS就会有这个提示,当你 "commit" 时,它被正式添加到服务器库中,问题解决。
      R [path] 象 "A" 一样,"R" 让您知道该文件计划要删除的,即删除了但尚未提交,这时你还使用update命令, CVS就会有这个提示,当你 " commit" 后,该文件就会从服务器库中删除,问题解决。
    7.10.2 cvsroot改变的情况
      服务器端操作:有些特殊情况需要更换或者是转移CVS服务器的, 这样只需要拷贝CVS服务器底下的cvsroot里的各个工程Module文件夹就可以了。
  客户端的操作:需要设置客户端的工程文件,更改为新服务器的信息,能与新服务器连接就可以继续工作了。
  如下图,先选中你需要修改cvsroot的工程Module文件夹,然后选择Macros—CVS下的Change CVSROOT菜单:

  接着会弹出一个(如下图)的信息框,会显示出你的这个工程文件夹目前(也就是指旧的)的CVSROOT信息,请检查并确定是与你信息吻合。

  接着(如下图)框中输入你要修改的新的CVSROOT,这样CVSROOT就改好了。

    这样你原先在本地机上的CVS工作文件就可以继续使用了。
    7.10.3 CVS术语:(cvs是Concurrent Versions System的缩写)
        1、 Repository-----仓库: CVS服务器的根目录。模块(Module)的集合
        2、 Module---------模块:,CVS服务器根目录下的第一级子目录。通常用于存放一个项目的所有文件
        3、 Checkout-------检出: 通常指将仓库中的一整个模块首次导出到本地。
        4、 Import----------导入:通常指通过提交整个目录结构并创建一个新的模块。
        5、 Release----------发行版本:整个产品的版本
        6、 Revision--------修订版:单个文件的版本
        7、 Tag--------------标签:在一个开发的特定期对一个文件集给定的符号名
        8、 Update----------更新:从模块中下载其他人的修改过的文件。更新本地的拷贝。
        9、 Commit---------提交:将自己修改过的文件提交到模块中。

版权所有:UML软件工程组织