CVS 使用问题集合

 

1. 2004-2-19: 在当前工作目录里面一次性递归添加一个目录,包括其子目录及文件
    使用 cvs import 命令,一次性的将要添加的子目录当作一个子模块导入到CVS仓库中,再用 cvs up 命令,将该子模块从CVS仓库中同步出来。
    具体方法如下:
    $ cd newdir/
    $ cvs import -m"add a new sub module" module_test/newdir hellocvs initnew
    $ cd ..
    $ cvs up -d

2. 2004-2-19: 对于Virsual SourceSafe和CVS都通用的TAG有
    $Header: /home/cvsroot/tech/cvs_card.html,v 1.5 2003/03/09 08:41:46 chedong Exp $
    $Author: chedong $
    $Date: 2003/06/28 18:36:26 $
    $Revision: 1.8 $

3. 2004-2-19: checkoutlist文件的使用
    这个文件包含一个列表,其中所涉及文件的检出拷贝将保存到仓库中。如果因为某种原因文件不能从仓库中检出,每一行给出的文件名和错误信息可以由CVS输出
        filename errormessage
    因为CVS知道已保存了存在的管理文件的检出拷贝,他们就不必在checkoutlist里面列出了。
    举例说明:
        工作拷贝目录:
        $ vi checkoutlist
            add "admin" to the list
        $ cvs ci checkoutlist
            commit the list
        $ vi admin
            add srni to the list
        $ cvs add admin
        $ cvs ci admin
            commit admin file

        然后在仓库目录里面就会有:
        .#admin
        admin
        admin,v
        这几个文件,其中admin,v是CVS保存的记录了历次修改版本信息文件,而admin就是因为其在checkoutlist中,所以自己从仓库检出的文件。
        管理员从客户端编辑admin文件并且提交的时候,服务器端就可以自动检出并且生效了。

4. 2004-2-19: 如下命令是CVSNT里面有,但是CVS(linux)里面没有的
    chacl        Change the Access Control List for a directory
    chown        Change the owner of a directory
    info         Display information about supported protocols
    ls           List files in the repository
 (cvs 1.12.9已经有该命令)
    lsacl        List the directories Access Control List
    passwd       Set the user's password (Admin: Administer users)
    authserver   Authentication server mode

    但是CVS(linux)里面多一个命令,这个命令在CVS作为服务器启动的时候有用:
   
pserver      Password server mode

5. 2004-2-19: 查看CVS的帮助信息
    --help-options  查看CVS的选项
    --help-commands 显示CVS命令列表
    --help-synonyms 显示CVS命令的别名列表
    -H command      查看某个命令的具体用法

6. 2004-2-23: 用shell脚本改变当前大的环境变量
    用 "$ . changeCVSROOT.sh" 这种方式运行shell脚本,才能够使该脚本在当前的shell环境中执行。
    Linux is designed that way. Any variable, defined in a
    subshell (child process), is local to the subshell, and
    subshells of itself (grandchild processes).

    Use '.' (dot) operator to execute the script is different
    story. commands in the script are executed in the
    current process one after another.

    我的简易脚本:
    #!/bin/sh
    # name:     changeCVSROOT.sh
    # usage:    $ . changeCVSROOT.sh --php
    parse_arguments() {
        for arg do
            case "$arg" in
                --php)          CVSROOT=:pserver:cvsread@cvs.php.net:/repository ;;
                --wiscom)       CVSROOT=:pserver:srni@172.18.10.20:/ACSTAR ;;
                --srni)         CVSROOT=:pserver:srni@172.18.10.213:/ACSTAR4 ;;
            esac
        done
    }

    if [ ! $1 ]; then
        echo "No Params"
    else
        parse_arguments $@
    fi

7. 2004-2-25 关于版本号的定义
    1). 版本号的格式为:a.b.c.d。
    其中 a - 主版本号(Major version), b - 副版本号(Minor version), c - 发布号(修正版本号)(Release), d - 编译号(扩展版本号)(build/extra)。
    主版本号和副版本号在项目计划中便已经指定,标志着重要的功能变动。Release版本号 c,用于体现小的功能变更或用来管理项目的分支。
    build号则在每次编译时自动加1。
   
    2). 我们遵循一个大众的版本定义规格,即: 主版本号.从版本号.修正版本号。
    其中,主、从版本号是由数字组成的,每次大的升级会更动主版本号,一般的升级只要更新从版本号,至于更小的修正(补丁、Beta测试等等)我们只更新修正版本号。
    一般修正版本号就是我们内部的编译版本号,每次编译程序就会更新。

8. 2004-3-1 关于开发控制规则
    1). 软件开发期,我们应该保持项目的CVS主干总是在一个稳定的状态,也就是说从主干上得到的最新对象集总是最新的发布版本,也可以说主干就是项目的发布分支,还可以说开发活动总是离开主干而进行的。
    2). 基于CVS系统的开发活动,我们分一下三种情况:单人单线开发、多人单线开发、多人并行开发,无论这三种情况怎样,我们都应该创建开发分支,将开发活动限定在开发分支上。
    3). 我考虑的CVS开发控制规范:
        1. 主干上的标签用 "REL_" 开头,开发分支的标签用 "DEV_" 开头,标签中的分隔符号用下划线 "_"。
        2. 在分支上进行开发活动,包括测试,待稳定的时候,合并到主干。主干在适当的时候,打上 "REL_" 的标签,表明开发进入一个新阶段了。
        3. 开发人员,不管是单人还是多人,检出的工作拷贝都是从分支来的。
        4. 产品发布,从主干按照标签检出不同时期的不同版本。
        5. 我将分支分为开发分支和功能分支。开发分支就是沿着主干线进行的开发。功能分支是为了特别的需要而进行的分支,如为了某个客户定制开发。
        6. 按我的设计,理想图入下,* 标识从分支向主干的合并:
                                   +---------+    +---------+    +---------+    +---------+
             DEV_Branch ->  +------| 1.2.2.1 |----| 1.2.2.2 |----| 1.2.2.3 |----| 1.2.2.4 |----.......      开发分支
                            |      +---------+    +---------+    +---------+    +---------+
                            |                          *                             *
        +---------+    +---------+                +---------+                   +---------+
        |   1.1   |----|   1.2   |----------------|   1.3   +-------------------|   1.4   |------......     主干
        +---------+    +---------+                +---------+                   +---------+
                                                       |
                                                       |    +---------+
                                    Patch_Branch ->    +----| 1.3.2.1 |----.....                            功能分支
                                                            +---------+

        当然实际应用不应该拘泥于此,应当根据实际项目的情况而做。最关键的还是保持主干的清晰,同时保证开发的轨迹完整,开发记录能够被完整的保留下来并且随时可以方便的查询和回溯。
             
9. 2004-3-2 版本号
    版本号是比较抽象的配置项。
    1). 方式一:以版本发布日期作为版本号
    这种版本号的标识方法比较简单,虽然无法看出系统一共发布的版本数量,以及各版本之间的不同性质,但可以直观的看出版本的发布日期。也比较容易记忆。
    如果项目组成员需要对版本的情况进行统计或者沟通,不需要依靠任何记录就可以定位出某个版本发布的日期。
    适用于:小型项目、版本频繁发布的项目。
    举例:2003-9-7发布了两个版本,分别是20030907A,20030907B
    应用的项目:ctais2.0。

    2). 方式二:采用“主版本号. 从版本号. 维护版本号. 补丁版本号”的形式
    这是大部分系统版本号的基础标识形式,每个版本号是阿拉伯数字,主版本号以1为起始数字,其他版本号以0为起始数字。可以进行裁减,类似“主版本号. 从版本号”的形式也是可以的。以这种方式来标识版本之后,当前版本的状态,以及版本发布的轨迹,都可以看得比较清楚。
    至于何谓主版本和从版本,每个项目组可以有自己的约定。比如功能的大幅度修改、正式发布给客户、上线等里程碑事件,都是应该反应在版本号的变化上的。
    适用于:比较正式的软件项目
    举例:第一个版本为 1.0.0.0,上线使用的版本为5. 11.18

    3). 可选方式三:给版本加上前缀以区分
    方式三、四并不是一种新的软件版本标识方法,它们通常增加在方式二的基础之上,以更好的标识版本。
    我们通常在软件前面看到alpha、beta、demo、release等前缀,这些标识有它们公认的含义,主要以区别版本的性质和用途。以下是参考资料。
    Alpha版(内部测试版):一般只在软件开发公司内部运行,不对外公开。主要是开发者自己对产品进行测试,检查产品是否存在缺陷、错误,验证产品功能与说明书、用户手册是否一致。
    Beta版(外部测试版):软件开发公司为对外宣传,将非正式产品免费发送给具有典型性的用户,让用户测试该软件的不足之处及存在问题,以便在正式发行前进一步改进和完善 。一般可通过Internet免费下载,也可以向软件公司索取。
    Demo版(演示版):主要是演示正式软件的部分功能,用户可以从中得知软件的基本操作,为正式产品的发售扩大影响。如果是游戏的话,则只有一两个关卡可以玩。该版本也可以从Internet上免费下载。
    Release版(发行版):不是正式版,带有时间限制,也是为扩大影响所做的宣传策略之一。比如Windows Me的发行版就限制了只能使用几个月,可从Internet上免费下载或由公司免费奉送。
    Full Version版(完全版):也就是正式版,是最终正式发售的版本。
    举例:beta2.0,release1.02
    适用于:较正式的软件、商用软件、游戏软件等

    4). 可选方式四:使用外部版本、内部版本两套机制
    当我们点击word帮助菜单的“关于”时,在抬头部分看到的是“word2002 (10.2627.2675)”。这里的2002、10.2627.2675分别是外部、内部版本号。因为让客户记住繁琐的内部版本号是困难的,另一方面,出于宣传等商业原因,很多商业软件不但有外部版本号,还把功能有大幅度改善的版本以不同的名称命名。比如windows98- windows Me- windows2000- windowsXP; RealPlayer8.0- RealOne Player V2.0等。
    适用于:商业软件

10. 2004-3-2 辅助标识
    CVS有以下两种方式来标识配置项:
    1). revisions
    和VSS的version一样,revision也是CVS自动分配的,通常操作人员不需要过于关心它变化的细节,只需要知道一个配置项的每个revision都是唯一,并且对应配置项的某个版本就可以了。之所以配置项的版本称作revision,是为了和软件项目的版本release区别。
    配置项的初始revision是1.1,通常情况下,CVS是以1.1?1.2?1.3这样的趋势去变化配置项的revision的。
    增加一个新文件的时候,第二个数字将为“1”, 第一个数字等于该目录中所有文件版本号第一个值的最大值。例如,当前目录包含版本号为1.7, 3.1和4.12的文件,则一个新文件的版本号应为4.1。
    2). tag
    和VSS的label有一些类似,tag也是用户给CVS里的某个或某些配置项创建的标识。但CVS对tag的名称控制的比较严格,一个tag必须以字母开头,后续多个字母,数字,减号和下划线,不能包括点号和空格。比如“release1-3-2”,“approvdBy Sqa”等。
    Tag的作用和VSS的label一致,也是给配置项标明一些我们想保留的信息的。

11. 2004-3-2 CVS的内部分支号
    一般的,分支号码将由奇数个"."分隔的十进制整数组成。请看4.1节[版本号码]。
    然而那并非完全是这样的,由于效率的原因,CVS有时插入一个额外的“0”在右末的第二个位置(1.2.4变为1.2.0.4,8.9.10.11.12变为8.9.10.11.0.12等)。 

12. 2004-3-15 粘滞性标签(Sticky Tag)
    按字面翻译是粘性标签。
    在CVS中,如果检出时指定版本树上的一个版本,对它进行的修改是无法直接提交的,这种情况下就叫sticky tag。
    要提交必须先在检出版本的地方创建分支,更新到分支,再修改提交到分支上。

13. 2004-3-15 SSH链接CVS服务
    $ CVS_RSH=ssh; export CVS_RSH
    $ cvs -d :ext:srni@172.18.10.31:/bak3/cvs co CVSROOT
    不需要像pserver访问那样需要login/logout了。

14. 2004-3-23 WINDOWS下使用SSH连接服务器
    有两种选择两种方式:
    两种选择:
        1. 使用putty的ssh
        2. 使用OpenSSH的windows版本(
http://lexa.mckenna.edu/sshwindows/)
    两种方法:(详细设置请参看两个文档:WinCVS_SSH_Guide.pdf cvssshwin.pdf)
        1. 使用命令行
            添加环境变量:CVS_RSH=C:\PROGRA~1\OpenSSH\bin\ssh.exe
            C:\cvs -d :ext:srni@172.18.10.31:/bak3/cvs co CVSROOT
        2. 使用WinCVS
    ( 下一个目标:研究如何在win下使用cvsnt开启ssh登陆方式:) )

15. 2004-3-23 CVS自带的工具
    从源码以默认方式安装的话,会在/usr/local/share/cvs/contrib里面找到有用的几个小工具。

16. 2004-3-24 里程碑
    (
http://www.chedong.com/tech/cvs_card.html)
    确认版本里程碑:多个文件各自版本号不一样,项目到一定阶段,可以给所有文件统一指定一个阶段里程碑版本号,方便以后按照这个阶段里程碑版本号导出项目,同时也是项目的多个分支开发的基础。
    cvs tag release_1_0

    开始一个新的里程碑:
    cvs commit -r 2 标记所有文件开始进入2.x的开发

    注意:CVS里的revsion和软件包的发布版本可以没有直接的关系。但所有文件使用和发布版本一致的版本号比较有助于维护。

17. 2004-3-24 CVS 删除的文件的恢复
    (
http://www.heynew.com/scmchina/topic.asp?topic_id=2218&forum_id=49&cat_id=9&CurPage=3)
    1.
    $ cvs  -r  x.x(删除时的版本号)  filename > filename
    $ cvs  add filename
    $ cvs  ci  -m " revived filename "  filename
    (filename是要恢复的文件名)

    2.
    如果你只执行了remove命令的话,你就直接 cvs add 文件名,这样就可以直接恢复还未提交的删除文件。
    如果执行了commit命令的话,要先输入cvs add 文件名,这时会得到一个空文件,然后选中这个空文件,执行update,得到这个文件的实体,在执行commit操作

18. 2004-3-24 sudo
    使用一个不可登陆的帐号cvs和组cvs作CVS仓库的属组。使用pserver服务模式。使用passwd文件管理帐号。
    # sudo -u cvs cvs -d /home/cvs init
    # sudo -u cvs touch /home/cvs/CVSROOT/passwd
    # sudo -u cvs touch /home/cvs/CVSROOT/readers

    Linux下的CVS pserver用户管理工具:cvspwd
         ************************************************************************
         * File:       cvspwd.c                                                 *
         * Author:     Peter Ajamian                                            *
         * Date:       February 10, 2001                                        *
         * Version:    2.0.5                                                    *
         * Copyright 2001 Peter Ajamian                                         *
         *                                                                      *
         * You _must_ read and agree to the terms set forth in the included     *
         * file license.txt before using, modifying, distributing, or           *
         * redistributing this software or any portion of this software.        *
         *                                                                      *
         * This program, based on the badly written cvspwd program distributed  *
         * by GlassFish Networking Interactive is designed to allow for easy    *
         * password management for the CVS pserver.  It uses no code whatsoever *
         * from the original GlassFish program.  It is designed to act very     *
         * much like the standard Unix passwd program.  This program should be  *
         * installed as root for systemwide access.  If that is not an option   *
         * it can be installed as the user who owns the Repository it will be   *
         * used on.  root and repository owners can use cvspwd to change        *
         * anyone's password.  Users can only change passwords if they can      *
         * first supply the original password for the account.  Unlike passwd   *
         * checking is not done on the passwords to insure integrity.  This     *
         * Program must be compiled with -lcrypt.                               *
         *                                                                      *
         * This program works on $CVSROOT/CVSROOT/passwd directly.  If someone  *
         * wants to try to modify it so it goes through the whole mess of       *
         * checking out the file, modifying it, and checking it back in then be *
         * my guest.                                                            *
         *                                                                      *
         * Usage:     cvspwd [-l|-u|-d|-s ]                  *
         *                                                                      *
         * Options:                                                             *
         *      -h              Display this help screen.                       *
         *      --help                                                          *
         *                                                                      *
         *      +r              Set user to read only mode.  This option is     *
         *                      available to root and repository owners only.   *
         *                                                                      *
         *      -r              Remove user from read only mode.  This option   *
         *                      is available to root and repository owners      *
         *                      only.                                           *
         *                                                                      *
         *      -l              Lock user.  This option will effectively lock   *
         *                      out the user by appending an `!' to the         *
         *                      beginning of his password.  This option is      *
         *                      available to root and repository owners only.   *
         *                                                                      *
         *      -u              Unlock user.  This is the opposite of -l.  This *
         *                      option is available to root and repository      *
         *                      owners only.                                    *
         *                                                                      *
         *      -d              Delete user.  This option is available to root  *
         *                      and repository owners only.                     *
         *                                                                      *
         *      -s              System Account.  This is the name of the system *
         *                      user to use for creating this entry in the      *
         *                      passwd file.  No checking is done to insure     *
         *                      that the user exists.  This overrides the       *
         *                      CVSPWDUSR environment variable.  Unlike the     *
         *                      CVSPWDUSR variable, setting this will change    *
         *                      the system user for an existing user.  This     *
         *                      option is available to root and repository      *
         *                      owners only.                                    *
         *                                                                      *
         *            The name of the CVS user (not the system user). *
         ************************************************************************

         使用注意:
         $ su -
         $ export CVSROOT=/home/cvs
         $ cvspwd -s cvs srni
         password:      ****
         re passwprd:   ****

19. 2004-3-24 Linux下的CVS的访问控制
    使用自带的工具cvs_acls.pl

20. 2004-4-14 合并于冲突
    CVS作合并总会保留合并前的一个版本。CVS不会随便将冲突的修改丢弃,而是提醒你。
    经常合并和更新,可以保证你当前的working和仓库中的差距很小,这是减少冲突的一个有效手段

21. 2004-5-17 关于捡出
    不要使用root帐号从CVS检出程序,应为有些程序需要使用非root帐号编译,使用root帐号checkout会导致权限不对。

22. 2004-6-25 关于回车换行
   
http://www.worldhello.net/doc/cvs_vs_starteam/cvs-faq.html#AEN1466
    服务器端
    无论在UNIX上还是WINDOWS(cvsnt)的服务器,都以同样的格式保存文本文件的换行符(无论是DOS的0D0A,还是UNIX上的0A,还是MAC上的0D)。服务器端都将换行符保存为 0A。
    但这并不是说在服务器端存储的文件(以 ,v结尾),不能包含字符“0D”。比如二进制文件中很多包含字符0D。文本文件也可能包含0D,但大部分包含0D的文本文件,很有可能是由于不当的跨平台使用CVS造成的。
    服务器端的这种处理方法很好的适应了跨平台特性。亦即Unix端服务器的Repository 可以直接拷贝到Windows端的Repository中,Vice Versa。
    在将Unix维护的服务器端,移植到Windows端,我曾经遇到一个百思不得其解的问题。后来发现是由于Winzip的一个古怪的缺省设置造成的:“TAR file smart CR/LF conversion”!
 
    UNIX 客户端
    Unix上的客户端文本原样存储保存到服务器端,0D作为普通字符随文件checkin,因为 Unix的默认文件换行符为 “0A”。
    但是如果Unix端的文件因为某种原因,如使用samba共享unix的文件系统,用WINDOWS 工具编辑,导致文件换行符变为 CRLF,则在 Unix 下 checkin,会将 OD 随文件checkin。

    Windows 客户端
    WINDOWS上的客户端,具有智能CRLT转换的功能,即:将文本文件中的CRLF转换为LF,提交到服务器端,又可以将服务器端的LF转换为CRLF。但是如果服务器端是CRLF,则转换为CRCRLF。

    WinCVS 客户端的双重身份
    WinCVS 可以兼具 Windows和Unix客户端的特性。当选择选项: Admin-->Preferences-->Globals-->Checkout text files with the Unix LF。则成为类似 Unix 客户端的功能。
    强烈建议不要选择该选项,让一个工具做它不相称的工作,出问题是迟早的事情。

    Cygwin 的CVS客户端
    Cygwin的客户端相当于 Unix 的客户端。
    由于运行在Windows上,可能经常提交带有 CRLF 的文本文件,因此我常常用Windows的客户端程序替换调 Cygwin 下自带的 CVS。

    CRLF引起的一团糟
     Client                  Action               Server
    ============================================================
       LF             -- Unix checkin -->           LF
      CRLF           <-- Windows checkout --        LF
      CRLF            -- Unix checkin -->          CRLF
     CRCRLF          <-- Windows checkout --       CRLF

    要防止混乱切记不要用Unix的CVS客户端(包括Cygwin的CVS客户端)Checkin DOS格式的文件。

23. 2004-7-21 CVSNT的一个不能登陆的小问题
使用 cvs passwd -a -r systemuser cvsuser 添加了一个帐号之后,用该帐号登陆出现类似如下的错误提示:
Fatal error, aborting.
cvs [checkout aborted]: CVSRECSTORE: Switch to user failed due to
configuration error.  Contact your System Administrator.
将你的机器重启一下看看:)

posted @ 2009-09-10 13:58  Rick Sun  阅读(4410)  评论(0编辑  收藏  举报