查看“UbuntuManual:版本控制系统”的源代码
来自Ubuntu中文
←
UbuntuManual:版本控制系统
跳到导航
跳到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
{{UbuntuManual}} == 第 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,这样做可以降低管理者不小心犯错的机率。 <pre><nowiki> # 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 </nowiki></pre> ==== CVS 会话例子 ==== 下面我们来设置 shell 环境以便访问 CVS 仓库。 ===== 匿名 CVS(仅用于下载) ===== 只读远程访问: <pre><nowiki> $ export CVSROOT=:pserver:anonymous@cvs.sf.net:/cvsroot/qref $ cvs login $ cvs -z3 co qref </nowiki></pre> ===== 使用本地 CVS 服务器 ===== 通过同一台机器上的 shell 进行本地访问: <pre><nowiki> $ export CVSROOT=/var/lib/cvs </nowiki></pre> ===== 使用远程 CVS pserver ===== 非 SSH(在 cvs 中使用 RSH 协议)远程访问: <pre><nowiki> $ export CVSROOT=:pserver:account@cvs.foobar.com:/var/lib/cvs $ cvs login </nowiki></pre> 易受窍听攻击。 ===== 通过 ssh 使用远程 CVS ===== 通过 SSH 进行远程访问: <pre><nowiki> $ export CVSROOT=:ext:account@cvs.foobar.com:/var/lib/cvs </nowiki></pre> 或连接 SourceForge: <pre><nowiki> $ export CVSROOT=:ext:account@cvs.sf.net:/cvsroot/qref </nowiki></pre> 亦可使用 RSA 认证( 用更少的密码建立连接 – RSA, 第 9.5.3 节),它不需要密码提示。 ===== 新建 CVS 档案 ===== 要建立如下的档案, <pre><nowiki> 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 </nowiki></pre> 则, <pre><nowiki> $ cd ~/project-x # 进源码目录 ... 创建源码树 ... $ cvs import -m "Start project-x" project-x Main-branch Release-initial $ cd ..; rm -R ~/project-x </nowiki></pre> ===== 使用 CVS ===== 使用本地 CVS 仓库来为 project-x 工作: <pre><nowiki> $ 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 # 删除本地源码(可选) </nowiki></pre> 应该记住的几个选项(用作 cvs 命令行的第一个参数): <pre><nowiki> -n 虚拟运行,无实际效果 -t 显示 cvs 活动步骤的信息 </nowiki></pre> ===== 从 CVS 取文件 ===== 要从 CVS 获得最新版本,用“tomorrow”: <pre><nowiki> $ cvs ex -D tomorrow module_name </nowiki></pre> ===== 管理 CVS ===== 为项目添加别名(本地服务器): <pre><nowiki> $ 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 ... 修改内容 ... </nowiki></pre> ==== CVS 常见问题及解决方法 ==== ===== 仓库中的文件权限 ===== CVS 不会覆盖当前仓库中的文件,而是用另一个文件替换它。因此,''对仓库目录的写权限''是很危险的权限。所以在新建仓库时,请运行下面的命令,确保权限合适。 <pre><nowiki> # cd /var/lib/cvs # chown -R root:src repository # chmod -R ug+rwX repository # chmod 2775 repository # 如果需要,当前目录和子目录 </nowiki></pre> ===== 执行标记(execution bit) ===== 当文件被别人取走后会保留执行标记,任何时候你遇到外出文件存在执行权限问题,可用下面的命令在 CVS 仓库中修改文件权限。 <pre><nowiki> # chmod ugo-x filename </nowiki></pre> ==== CVS 命令 ==== 这儿是一些 CVS 命令的用法简介。 <pre><nowiki> {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... </nowiki></pre> === Subversion === Subversion 是下一代版本控制系统,它将替代 CVS。当前开发者称它还处于“alpha”阶段,但对大多数用户而言它已足够稳定了。到本文档写作之时,Subversion 可在大部分UNIX、LINUX、WINDOWS操作系统上可用。 ==== 安装 Subversion 服务器 ==== subversion meta-package 依赖一些关联包(libapache2-svn 和 subversion-tools)来配置服务器。 ===== 创建仓库 ===== 当前,subversion 软件包无法创建仓库,所以用户需要手工创建它们。通常可在 /var/local/repos 下创建仓库。 创建目录: <pre><nowiki> # mkdir -p /var/local/repos </nowiki></pre> 创建仓库数据库: <pre><nowiki> # svnadmin create /var/local/repos </nowiki></pre> 将仓库的写权限赋给 WWW server: <pre><nowiki> # chown -R www-data:www-data /var/local/repos </nowiki></pre> ===== 配置 Apache2 ===== 通过用户认证授权访问仓库,添加(或去掉注释符)下列内容到 /etc/apache2/mods-available/dav_svn.conf: <pre><nowiki> <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> </nowiki></pre> 接着,使用下面的命令创建用户认证文件: <pre><nowiki> htpasswd2 -c /etc/subversion/passwd some-username </nowiki></pre> 重启 Apache2,就可以使用 URLhttp://hostname/repos 来访问新的 Subversion 仓库了。 ==== 将 CVS 仓库迁移到 Subversion ==== ==== Subversion 用法样例 ==== 下面的小节将教你如何在 Subversion 下使用各种命令。 ===== 创建新的 Subversion 档案 ===== 创建新的 subversion 档案,输入下面的命令: <pre><nowiki> $ cd ~/your-project # 进入源码目录 $ cd .. $ svn import your-project http://localhost/repos/project-name -m "initial project import" </nowiki></pre> 这将在你的 Subversion 仓库下创建一个名为 project-name 的目录,用来存放你的项目文件。查看 http://localhost/repos/ 它是否在那儿? ===== 使用 subversion ===== 用 subversion 来管理 project-y: <pre><nowiki> $ 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 </nowiki></pre> [[Category:Ubuntu_参考手册]]
该页面使用的模板:
模板:UbuntuManual
(
查看源代码
)
返回
UbuntuManual:版本控制系统
。
导航菜单
页面操作
页面
讨论
阅读
查看源代码
历史
页面操作
页面
讨论
更多
工具
个人工具
登录
导航
首页
最近更改
随机页面
页面分类
帮助
搜索
编辑
编辑指南
沙盒
新闻动态
字词处理
工具
链入页面
相关更改
特殊页面
页面信息