[ 上一页 ] [ 目录 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ 下一页 ]


Debian 参考手册
第 12 章 - 系统版本控制


12.1 并行版本系统(CVS)

有关的详细信息可使用 lynx 查阅 /usr/share/doc/cvs/html-cvsclient/usr/share/doc/cvs/html-info/usr/share/doc/cvsbook 或执行 info cvsman cvs


12.1.1 安装 CVS 服务器

以下步骤配置的服务器,仅允许“src”用户组的成员访问 CVS 仓库,并且仅“staff”用户组的成员才可管理 CVS,这样做可以降低管理者不小心犯错的机率。

     # cd /var/lib; umask 002 ; sudo mkdir cvs # [Woody] FSH
     # apt-get install cvs cvs-doc cvsbook
     # export CVSROOT=/var/lib/cvs
     # cd $CVSROOT
     # chown root:src .  # 设置为”staff“可加强对新建项目行为的限制
     # chmod 3775 .             # 如果上面的赋值为”staff“,则使用 2775
     # cvs -d /var/lib/cvs init # 在此明确地指定 -d 更安全
     # cd CVSROOT
     # chown -R root:staff .
     # chmod 2775 .
     # touch val-tags 
     # chmod 664 history val-tags
     # chown root:src history val-tags

12.1.2 CVS 会话例子

下面我们来设置 shell 环境以便访问 CVS 仓库。


12.1.2.1 匿名 CVS(仅用于下载)

只读远程访问:

     $ export CVSROOT=:pserver:anonymous@cvs.sf.net:/cvsroot/qref
     $ cvs login
     $ cvs -z3 co qref

12.1.2.2 使用本地 CVS 服务器

通过同一台机器上的 shell 进行本地访问:

     $ export CVSROOT=/var/lib/cvs

12.1.2.3 使用远程 CVS pserver

非 SSH(在 cvs 中使用 RSH 协议)远程访问:

     $ export CVSROOT=:pserver:account@cvs.foobar.com:/var/lib/cvs
     $ cvs login

易受窍听攻击。


12.1.2.4 通过 ssh 使用远程 CVS

通过 SSH 进行远程访问:

     $ export CVSROOT=:ext:account@cvs.foobar.com:/var/lib/cvs

或连接 SourceForge:

     $ export CVSROOT=:ext:account@cvs.sf.net:/cvsroot/qref

亦可使用 RSA 认证(用更少的密码建立连接 – RSA, 第 9.5.3 节),它不需要密码提示。


12.1.2.5 新建 CVS 档案

要建立如下的档案,

     ITEM              VALUE                    MEANING
     source tree:      ~/project-x              All source codes
     Project name:     project-x                Name for this project
     Vendor Tag:       Main-branch              Tag for the entire branch
     Release Tag:      Release-original         Tag for a specific release

则,

     $ cd ~/project-x                 # 进源码目录
      ... 创建源码树 ...
     $ cvs import -m "Start project-x" project-x Main-branch Release-initial
     $ cd ..; rm -R ~/project-x

12.1.2.6 使用 CVS

使用本地 CVS 仓库来为 project-x 工作:

     $ cd                            # 转到工作域
     $ cvs co project-x              # 从 CVS 下载源码到本地
     $ cd project-x
      ... 修改源码内容 ...
     $ cvs diff -u                   # 相当于 diff -u repository/ local/
     $ cvs up -C modified_file       # 撤消对文件的修改
     $ cvs ci -m "Describe change"   # 保存本地源码到 CVS
     $ vi newfile_added
     $ cvs add newfile_added
     $ cvs ci -m "Added newfile_added"
     $ cvs up                        # 从 CVS 合并最新版本
      ... 生成所有在 CVS 里新创建的子目录,使用
      ... "cvs up -d -P" 代替 "cvs up"
      ... 注意以 "C filename" 开头的行,这表示在更新过程中,产生了冲突
      ... 未修改的本地代码文件被重命名为 `.#filename.version'.
      ... 在 filename 里面查找 "<<<<<<<" 和 ">>>>>>>",可以找到发生冲突的地方
     $ cvs tag Release-1             # 添加 release tag
      ... 进一步修改 ...
     $ cvs tag -d Release-1          # 移除 release tag
     $ cvs ci -m "more comments"
     $ cvs tag Release-1             # 重新添加 release tag
     $ cd                            # 返回工作域
     $ cvs co -r Release-initial -d old project-x
      ... 得到原始版本到 old 目录
     $ cd old
     $ cvs tag -b Release-initial-bugfixes # 创建分支 (-b) 标签
      ... 现在可以在老版本工作(Tag=sticky)
     $ cvs update -d -P
      ... 源代码树现在有粘滞标签 "Release-initial-bugfixes"
      ... 在这个分支下工作
     $ cvs up -d -P # 同步这个分支下其它人修改的文件
     $ cvs ci -m "check into this branch"
     $ cvs update -kk -A -d -P
      ... 删除粘滞标签,忽略从主干的更新,
      ... 不扩展关键字
     $ cvs update -kk -j Release-initial-bugfixes
      ... 从 Release-initial-bugfixes 分支移植到主干,不扩展关键字 
      ... 使用编辑器修改冲突
     $ cvs ci -m "merge Release-initial-bugfixes"
     $ cd
     $ tar -cvzf old-project-x.tar.gz old     # 产生文档, -j 选项生成 bz2 格式的压缩包
     $ cvs release -d old               # 删除本地源码(可选)

应该记住的几个选项(用作 cvs 命令行的第一个参数):

     -n      虚拟运行,无实际效果
     -t      显示 cvs 活动步骤的信息

12.1.2.7 从 CVS 取文件

要从 CVS 获得最新版本,用“tomorrow”:

     $ cvs ex -D tomorrow module_name

12.1.2.8 管理 CVS

为项目添加别名(本地服务器):

     $ su - admin           # staff 用户组成员
     $ export CVSROOT=/var/lib/cvs
     $ cvs co CVSROOT/modules
     $ cd CVSROOT
     $ echo "px -a project-x" >>modules
     $ cvs ci -m "Now px is an alias for project-x"
     $ cvs release -d .
     $ exit                 # 按 Ctrl-D 从 su 返回
     $ cvs co -d project px 
      ... 从 CVS 检出 project-x (别名:px)到目录 project
     $ cd project
      ... 修改内容 ...

12.1.3 CVS 常见问题及解决方法


12.1.3.1 仓库中的文件权限

CVS 不会覆盖当前仓库中的文件,而是用另一个文件替换它。因此,对仓库目录的写权限是很危险的权限。所以在新建仓库时,请运行下面的命令,确保权限合适。

     # cd /var/lib/cvs
     # chown -R root:src repository
     # chmod -R ug+rwX   repository
     # chmod    2775     repository  # 如果需要,当前目录和子目录

12.1.3.2 执行标记(execution bit)

当文件被别人取走后会保留执行标记,任何时候你遇到外出文件存在执行权限问题,可用下面的命令在 CVS 仓库中修改文件权限。

     # chmod ugo-x filename

12.1.4 CVS 命令

这儿是一些 CVS 命令的用法简介。

     {add|ad|new} [-k kflag] [-m 'message'] files...
     {admin|adm|rcs} [rcs-options] files...
     {annotate|ann} [options] [files...]
     {checkout|co|get} [options] modules...
     {commit|ci|com}   [-lnR]  [-m  'log_message'  |  -f  file] \
             [-r revision] [files...]
     {diff|di|dif} [-kl] [rcsdiff_options] [[-r rev1 | -D date1] \
             [-r rev2 |  -D date2]] [files...]
     {export|ex|exp} [-flNn] -r rev|-D date [-d dir] [-k kflag] module...
     {history|hi|his} [-report] [-flags] [-options args] [files...]
     {import|im|imp} [-options] repository vendortag releasetag...
     {login|logon|lgn}
     {log|lo|rlog} [-l] rlog-options [files...]
     {rdiff|patch|pa} [-flags] [-V vn] [-r t|-D d [-r t2|-D d2]] modules...
     {release|re|rel} [-d] directories...
     {remove|rm|delete} [-lR] [files...]
     {rtag|rt|rfreeze} [-falnR]  [-b]  [-d]  [-r  tag  |  -D  date] \
              symbolic_tag modules...
     {status|st|stat} [-lR] [-v] [files...]
     {tag|ta|freeze} [-lR] [-F] [-b] [-d] [-r tag | -D date]  [-f] \
              symbolic_tag [files...]
     {update|up|upd} [-AdflPpR] [-d] [-r tag|-D date] files...

12.2 Subversion

Subversion 是下一代版本控制系统,它将替代 CVS。当前开发者称它还处于“alpha”阶段,但对大多数用户而言它已足够稳定了。到本文档写作之时,Subversion 仅在 Debian unstable 版中可用。


12.2.1 安装 Subversion 服务器

subversion meta-package 依赖一些关联包(libapache2-svnsubversion-tools)来配置服务器。


12.2.1.1 创建仓库

当前,subversion 软件包无法创建仓库,所以用户需要手工创建它们。通常可在 /var/local/repos 下创建仓库。

创建目录:

     # mkdir -p /var/local/repos

创建仓库数据库:

     # svnadmin create /var/local/repos

将仓库的写权限赋给 WWW server:

     # chown -R www-data:www-data /var/local/repos

12.2.1.2 配置 Apache2

通过用户认证授权访问仓库,添加(或去掉注释符)下列内容到 /etc/apache2/mods-available/dav_svn.conf

     <Location /repos>
       DAV svn
       SVNPath /var/local/repos
       AuthType Basic
       AuthName "Subversion repository"
       AuthUserFile /etc/subversion/passwd
       <LimitExcept GET PROPFIND OPTIONS REPORT>
         Require valid-user
       </LimitExcept>
     </Location>

接着,使用下面的命令创建用户认证文件:

     htpasswd2 -c /etc/subversion/passwd some-username

重启 Apache2,就可以使用 URLhttp://hostname/repos 来访问新的 Subversion 仓库了。


12.2.2 将 CVS 仓库迁移到 Subversion


12.2.3 Subversion 用法样例

下面的小节将教你如何在 Subversion 下使用各种命令。


12.2.3.1 创建新的 Subversion 档案

创建新的 subversion 档案,输入下面的命令:

     $ cd ~/your-project      # 进入源码目录
     $ cd ..        
     $ svn import your-project http://localhost/repos/project-name  -m "initial project import"

这将在你的 Subversion 仓库下创建一个名为 project-name 的目录,用来存放你的项目文件。查看 http://localhost/repos/ 它是否在那儿?


12.2.3.2 使用 subversion

用 subversion 来管理 project-y

     $ cd                            # 转到工作域
     $ svn co http://localhost/repos/project-y  # 提取源码
     $ cd project-y
      ... 完成一些工作 ...
     $ svn diff                      # 相当于 diff -u repository/ local/  
     $ svn revert modified_file      # 撤消对文件所做的修改
     $ svn ci -m "Describe changes"  # 将你做的修改保存到仓库中
     $ vi newfile_added
     $ svn add newfile_added
     $ svn add new_dir               # 将所有的文件嵌套式地加到 new_dir
     $ svn add -N new_dir2           # 非嵌套式地添加目录
     $ svn ci -m "Added newfile_added, new_dir, new_dir2"
     $ svn up                        # 从仓库中合并最新的版本
     $ svn log                       # 显示所有修改记录
     $ svn copy http://localhost/repos/project-y \
           http://localhost/repos/project-y-branch \
           -m "creating my branch of project-y"  # 对 project-y 进行分支
     $ svn copy http://localhost/repos/project-y \
           http://localhost/repos/proj-y_release1.0 \
           -m "project-y 1.0 release"    # 增加 release 标签
      ... 注意分支和标签是一样。唯一的不同是 
      ... 分支可以提交,而标签不可以。
     
      ... 对分支进行修改 ...
     
     $ # merge branched copy back to main copy
     $ svn merge http://localhost/repos/project-y \
        http://localhost/repos/project-y-branch
     $ svn co -r 4 http://localhost/repos/project-y # 得到版本 4

[ 上一页 ] [ 目录 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ 下一页 ]


Debian 参考手册

CVS, 星期四 一月 18 11:53:48 UTC 2007

Osamu Aoki osamu#at#debian.org
译者:
Hao "Lyoo" Liu iamlyoo#at#163.net
Ming Hua minghua#at#rice.edu
肖盛文 atzlinux#at#163.com
Haifeng Chen optical.dlz#at#gmail.com
解彦博 xieyanbo#at#gmail.com
easthero easthero#at#gmail.com
作者, 第 A.1 节