• 当前位置:首页>>Linux系统教程>>Linux软件使用>>CVS-RCS(二)
  • CVS-RCS(二)
  • 3.2 从 RCS 转换到 CVS 系统
    要转换已经存在的 RCS 档案到 CVS ,请使用下面的 script 。并确定你从你的 Linux CD-ROM 安装了 korn shell 套件 pdksh*.rpm。
    注意 : Korn shell /bin/ksh 在你从Linux CD-ROM 安装 pdksh*.rpm 时就会产生
    _________________________________________________________________
    #!/bin/ksh

    #############################################################
    # Program to Migrate the existing source code in RCS to CVS
    #
    # Needs the korn shell RPM package pdksh*.rpm from Linux
    # contrib cdrom
    #############################################################

    #
    # rcs2cvs - convert source tree from RCS to CVS
    #

    # project to convert
    PROJECT='project'

    # current RCS root
    RCSROOT="$HOME/rcs"

    if cd "$RCSROOT/$PROJECT"
    then
    cd "$RCSROOT"
    else
    echo >&2 "`basename "$0"`: can't change to RCS directory '$RCSROOT/$PRO
    JECT'."
    exit 1
    fi

    # current CVS root
    CVSROOT="$HOME/cvs"

    # create new CVS directory for project 'project'
    if mkdir "$CVSROOT/$PROJECT"
    then
    :
    else
    echo >&2 "`basename "$0"`: can't create CVS directory '$CVSROOT/$PROJEC
    T'."
    exit 2
    fi

    # create CVS project tree from RCS tree
    find "$PROJECT" -type d -name RCS -print |
    while read RCS
    do
    CVS="`dirname "$RCS"`"
    (if cd "$RCS"
    then
    # if find . -type f -name '*,v' -print | cpio -pdmv "$CVSROOT/$CV
    S"
    if find . -type f -print | cpio -pdmv "$CVSROOT/$CVS"
    then
    :
    else
    echo >&2 "`basename "$0"`: can't convert RCS subdirecto
    ry '$RCSROOT/$RCS' to CVS subdirectory '$CVSROOT/$CVS'."
    fi
    else
    echo >&2 "`basename "$0"`: can't change to RCS subdirectory '$R
    CSROOT/$RCS'."
    fi)
    done
    _________________________________________________________________

    现在 RCS 已经被改成 CVS 系统下的 'project'. 你可以开始用CVS命令来存取
    'project' 这个模组了.
    4. Shell Scripts

    下面的 scripts 是基本 CVS 命令的集合,而且是 Korn shell 的 scripts 。你 可以把他转成 perl 或者 bash。你可以自己修改成你想要的样子。 这些只是运 用基本 CVS 命令但有些特殊的花样加在里面。例如, sedit 这个 script 提供了档案锁住的功能使得其他人知道有某人正在修改这个档案, 当然你也可以直接 使用 CVS 命令而不用这些 scripts ,这些 scripts 只是在展示 CVS 是多麽的
    有弹性。

    把这些 scripts 复制到 /usr/local/bin 下,并且此目录应该在你的 PATH 环境 变数中。
    1. sget [-r revision_number] 要从 CVS 获得一个唯 读档案或整个唯读目录, 请按 [9]sget
    2. sedit [-r revision_number] 要修改一个一个程式码时,这个 scripts 会做档案锁住的动作,因此没有别人可以登出这个档案了。当然你 可以改变这个 script 成你想要的功能 - 例如不锁住,只出现警告讯息,或 者相反的,非常严谨的锁档案。 请按 [10]sedit
    3. scommit [-r revision_number] 要交出某个你修改的档案或整 个目录。 把你的改变交给 CVS。 请按 [11]scommit
    4. supdate 要藉由从 CVS 得到最新的档案来update 一 个档案或整个目录。 请按 [12]supdate
    5. sunlock [-r revision_number] 要把因为用 sedit 後的档案锁 关掉。这会释放档案锁(Release File Lock)。 请按 [13]sunlock
    6. slist 要看目前正被你修改的档案列表。 做 'ls -l | grep | ...' 命令, 请按 [14]slist
    7. sinfo 要得到一个档案的改版资讯。 请按 [15]sinfo
    8. slog 要得到一个 CVS 档案改版的历史纪录, 请按 [16]slog

    9. sdif
    sdif -r rev1 -r rev2 要得到你的档案与 CVS 柜子里的档案不 同的地方在哪里。 请按 [17]sdif
    注意: sdif 只有一个 'f' ,因为这里已经有一个 unix 命令叫 'sdiff'。
    10. sadd 要新增一个档案到 CVS 柜子里。 请按 [18]sadd
    11. sdelete 要从 CVS 柜子里清掉一个档案。 请按 [19]sdelete
    12. sfreeze 要冻结原始码 (freeze codes) ,这是将要发行 (release) 整个原始码目录树。 请按
    [20]sfreeze
    13. saddtree 要新增一个目录树到 CVS 。
    请按 [21]saddtree
    例如 :
    _____________________________________________________________

    cd $HOME;
    sfreeze REVISION_1_0 srctree
    _____________________________________________________________

    这将会冻结原始码,并贴上一个标签 REVISION_1_0 ,如此一来你就可以稍 後用版本名字登出整个目录树。
    ******************************************************

    4.1 sget
    注意 : Korn shell /bin/ksh 在你从Linux CD-ROM 安装 pdksh*.rpm 时就会产 生
    请把他存成一般文字档并改变存取权限 chmod a+rx
    _________________________________________________________________
    #!/bin/ksh

    # CVS program sget
    # Program to check out the file from CVS read-only

    cmdname=`basename $0`

    Usage()
    {
    print "\nUsage: $cmdname [-r revision_number/symbolic_tag_name] irectory name> "
    print "The options -r are optional "
    print "For example - "
    print " $cmdname -r 1.1 foo.cpp"
    print " $cmdname foo.cpp "
    print " $cmdname some_directory "
    print "Extract by symbolic revision tag like - "
    print " $cmdname -r REVISION_1 some_directory "
    print " "
    exit
    }

    # Command getopt will not supported in next major release.
    # Use getopts instead.
    while getopts r: ii
    do
    case $ii in
    r) FLAG1=$ii; OARG1="$OPTARG";;
    ?) Usage; exit 2;;
    esac
    done
    shift ` expr $OPTIND - 1 `

    #echo FLAG1 = $FLAG1 , OARG1 = $OARG1

    if [ $# -lt 1 ]; then
    Usage
    fi

    bkextn=sget_bak

    hme=` echo $HOME | cut -f1 -d' ' `
    if [ "$hme" = "" ]; then
    print "\nError: \$HOME is not set!!\n"
    exit
    fi

    # Check if file already exists....
    if [ -f $1 ]; then
    user_perms=" "
    group_perms=" "
    other_perms=" "
    user_perms=`ls -l $1 | awk '{print $1 }' | cut -b3-3 `
    group_perms=`ls -l $1 | awk '{print $1 }' | cut -b6-6 `
    other_perms=`ls -l $1 | awk '{print $1 }' | cut -b9-9 `
    if [ "$user_perms" = "w" -o "$group_perms" = "w" \
    -o "$other_perms" = "w" ]; then
    print "\nError: The file is writable. Aborting $cmdname ......"
    print " You should either backup, scommit or delete the f
    ile and"
    print " try $cmdname again\n"
    exit
    fi
    fi

    cur_dir=`pwd`
    #echo $cur_dir

    len=${#hme}
    len=$(($len + 2))
    #echo $len

    subdir=` echo $cur_dir | cut -b $len-2000 `
    #echo $subdir

    if [ "$subdir" = "" ]; then
    fdname=$1
    else
    fdname=$subdir"/"$1
    fi

    # Move the file
    touch $1 2>/dev/null
    \mv -f $1 $1.$bkextn

    # Create subshell
    (
    cd $hme
    #echo $fdname

    # Use -A option to clear all sticky flags
    if [ "$FLAG1" = "" ]; then
    cvs -r checkout -A $fdname
    else
    cvs -r checkout -A -$FLAG1 $OARG1 $fdname
    fi
    )
    #pwd

    if [ -f $1 ]; then
    print "\nREAD-ONLY copy of the file $fdname obtained."
    print "Done $cmdname"
    #print "\nTip (Usage): $cmdname \n"
    fi  
  • 上一篇:进行有效编辑的七种习惯
    下一篇:无