UbuntuManual:版本控制系统:修订间差异
Dbzhang800(留言 | 贡献) 小 新页面: {{UbuntuManual}} == 第 12 章 - 系统版本控制 == === 并行版本系统 (CVS) === 有关的详细信息可使用 lynx 查阅 /usr/share/doc/cvs/html-cvsclient、/usr/share/doc/cvs/h... |
|||
第306行: | 第306行: | ||
$ svn co -r 4 http://localhost/repos/project-y # 得到版本 4 | $ svn co -r 4 http://localhost/repos/project-y # 得到版本 4 | ||
</nowiki></pre> | </nowiki></pre> | ||
[[Category:Ubuntu_参考手册]] |
2010年4月23日 (五) 18:40的最新版本
序言 | Ubuntu 基础 | Ubuntu 系统安装提示 | Ubuntu指南 |
发行版升级 | Ubuntu 软件包管理 | Ubuntu下的 Linux 内核 | Ubuntu 小技巧 |
Ubuntu 系统微调 | 网络设置 | 编辑器 | 版本控制系统 |
编程 | GnuPG | Ubuntu 技术支持 | 附录 |
第 12 章 - 系统版本控制
并行版本系统 (CVS)
有关的详细信息可使用 lynx 查阅 /usr/share/doc/cvs/html-cvsclient、/usr/share/doc/cvs/html-info、/usr/share/doc/cvsbook 或执行 info cvs 及 man cvs。
安装 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
CVS 会话例子
下面我们来设置 shell 环境以便访问 CVS 仓库。
匿名 CVS(仅用于下载)
只读远程访问:
$ export CVSROOT=:pserver:[email protected]:/cvsroot/qref $ cvs login $ cvs -z3 co qref
使用本地 CVS 服务器
通过同一台机器上的 shell 进行本地访问:
$ export CVSROOT=/var/lib/cvs
使用远程 CVS pserver
非 SSH(在 cvs 中使用 RSH 协议)远程访问:
$ export CVSROOT=:pserver:[email protected]:/var/lib/cvs $ cvs login
易受窍听攻击。
通过 ssh 使用远程 CVS
通过 SSH 进行远程访问:
$ export CVSROOT=:ext:[email protected]:/var/lib/cvs
或连接 SourceForge:
$ export CVSROOT=:ext:[email protected]:/cvsroot/qref
亦可使用 RSA 认证( 用更少的密码建立连接 – RSA, 第 9.5.3 节),它不需要密码提示。
新建 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
使用 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 活动步骤的信息
从 CVS 取文件
要从 CVS 获得最新版本,用“tomorrow”:
$ cvs ex -D tomorrow module_name
管理 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 ... 修改内容 ...
CVS 常见问题及解决方法
仓库中的文件权限
CVS 不会覆盖当前仓库中的文件,而是用另一个文件替换它。因此,对仓库目录的写权限是很危险的权限。所以在新建仓库时,请运行下面的命令,确保权限合适。
# cd /var/lib/cvs # chown -R root:src repository # chmod -R ug+rwX repository # chmod 2775 repository # 如果需要,当前目录和子目录
执行标记(execution bit)
当文件被别人取走后会保留执行标记,任何时候你遇到外出文件存在执行权限问题,可用下面的命令在 CVS 仓库中修改文件权限。
# chmod ugo-x filename
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...
Subversion
Subversion 是下一代版本控制系统,它将替代 CVS。当前开发者称它还处于“alpha”阶段,但对大多数用户而言它已足够稳定了。到本文档写作之时,Subversion 可在大部分UNIX、LINUX、WINDOWS操作系统上可用。
安装 Subversion 服务器
subversion meta-package 依赖一些关联包(libapache2-svn 和 subversion-tools)来配置服务器。
创建仓库
当前,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
配置 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 仓库了。
将 CVS 仓库迁移到 Subversion
Subversion 用法样例
下面的小节将教你如何在 Subversion 下使用各种命令。
创建新的 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/ 它是否在那儿?
使用 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