| 第 12 章 - 系统版本控制 |
12.1 并行版本系统 (CVS)有关的详细信息可使用 lynx 查阅 /usr/share/doc/cvs/html-cvsclient、/usr/share/doc/cvs/html-info、/usr/share/doc/cvsbook 或执行 info cvs 及 man 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 认证(),它不需要密码提示。 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 SubversionSubversion 是下一代版本控制系统,它将替代 CVS。当前开发者称它还处于“alpha”阶段,但对大多数用户而言它已足够稳定了。到本文档写作之时,Subversion 仅在 Debian unstable 版中可用。 12.2.1 安装 Subversion 服务器subversion meta-package 依赖一些关联包(libapache2-svn 和 subversion-tools)来配置服务器。 12.2.1.1 创建仓库当前,subversion 软件包无法创建仓库,所以用户需要手工创建它们。通常可在 /var/local/repos 下创建仓库�
|
||||