版本控制工具SVN和CVS
CVS相信大家都听说过,不过这个广为使用的版本控制工具还有不少问题,包括中文支持和二进制文件的处理都有或多或少的问题。
现在好了,CVS的作者又为我们开发了SVN。Gnome和KDE的开发团队都已经换用SVN了,您为什么不试一下呢?
最基本的用法
建立代码库 svnadmin create /path/to/repos导入数据 svn import /path/to/project file::///path/to/repos -m "initial import"导出数据 svn checkout file::///path/to/repos提交更新 svn commit filename添加文件 svn add删除文件 svn delele 复制文件 svn copy移动文件 svn move查询状态 svn status检查不同 svn diff同步工作目录 svn update合并代码 svn merge;svn resolve
SVN的相关资源
这里是SVN的项目网站。
<<Version Control with Subversion>>的电子书。
这里是繁体中文的SVN文档(只有部分被翻译过来了)。
不能不提的CVS
虽然我已经转入了SVN的阵营,但是CVS仍然是应用最为广泛的版本控制软件之一。这里收集了一些关于CVS的资源。
CVS使用简介
(注:这是oscargreat整理的资料,我拿来用相信他不会介意:)
什么是CVS
CVS(Cocurrent Version Systems,并发版本系统)是一个C/S模式的版本控制系统,用于在软件开发过程中记录文件版本,协调开发人员保证文件同步,从而保证项目正确的进行并行开发,并支持版本回滚、bug 跟踪和补丁生成。使用CVS可以有效地对软件开发的源代码和开发文档进行统一的管理和组织。
CVS的工作模式:
CVS的基本工作模式如下:
CVS服务器(代码文档库) / | / (版 本 同 步) / | / 开发者1 开发者2 开发者3CVS在服务器端维护代码文档库,不同的开发者在本地机器上建立对应代码树,并利用CVS保持本地代码文档同代码文档库的一致。当由于多个开发者对文件的同时修改造成本地与库中的代码文件冲突时,CVS报告并协助解决冲突代码的合并问题。普通开发者(非管理员)对CVS的使用流程如下所示:
Check out(获取) -------------------- Merge(合并) | | ^ v v Conflict(冲突) | Modify(修改)-> Update(更新) ---------------- ^ | | | No Conflict(无冲突) | v Update(更新) <- Commit(提交) | v Export(导出)
check out命令只需在开始建立本地代码树时使用一次,其后更新本地代码则使用update命令。update命令比较服务器和本地代码库的区别,并把本地代码树中过时的文件自动更新。当完成对代码的修改之后,在提交代码之前同样需要使用update命令,以获取他人并行修改的的代码。如果出现冲突(即对同一文件同时进行了修改),CVS将在本地代码中把两者都保留并标记出来,要求开发者处理冲突。在冲突不存在或已解决的情况下,使用commit命令将服务器代码更新为本地代码。CVS要求为更改提供注释,并自动为更新的文件处理版本编号。当软件需要正式发布时,使用export命令导出不包含CVS设置信息的源代码树。
CVS的管理员还使用包括init, import, admin等命令对服务器和代码库进行配置和设置。
CVS在Linux下客户端的使用
Linux下的多种IDE/Editor,如Emacs,Eclipse等都对CVS提供了支持,但基于命令行的cvs操作是最为基本和灵活的。以下介绍CVS命令行的使用。
环境变量
CVSROOT 指定代码库的位置 如果CVS代码库在本地机器上,可直接指定代码库的路径,如: export CVSROOT=/path/to/cvsroot 如果CVS代码库在服务器上,则还需指定服务器位置,通信方式 及用户等信息,格式为: CVSROOT=:method:username@cvs.server.address#port:/path/to/cvsroot 例如: export CVSROOT=:ext:horn@166.111.55.119:/cvs/horn 其中ext指定使用SSH协议,horn是有权访问服务器相应目录的 用户。 CVSROOT的值可以在命令行上用-d选项重新指定,如: cvs -d /cvs/horn update
CVS_RSH 指定客户端访问服务器的协议 使用SSH协议时,可如下设置: export CVS_RSH=ssh
基本命令
cvs的命令行格式为:
cvs [options] command [options] filename
具体参数可参考info cvs
cvs的命令如果不带参数,则总是以当前所在目录作为操作对象。
以下介绍基本命令:
init CVS代码库的初始化,管理员使用。 cvs -d /cvs/horn init 将/cvs/horn初始化为一个代码库
import 导入一个项目/模块,管理员使用。 cvs import -m "comments" project_name vendor_tag release_tag 执行后,会将当前目录下所有文件及目录导入到 /path/to/cvsroot/project_name 目录下。 vender_tag: 开发商标记 release_tag: 初始版本标记 -m 参数如果不加,则cvs会自动启动vi,要求输入注释。 如: cd /home/horn/blob-2.05/ cvs import blob Hornworks InitVersion
checkout/co 从服务器获取代码,在本地建立代码树 cvs checkout project_name
update/up 将本地文件同步到最新的版本 cvs update filename 不指定文件名,cvs将当前目录下所有子目录下的文件。如前 所述,在每天工作前和工作之后commit之前都应当update,以 保证本地代码总是最新的,且和服务器的代码无冲突。
commit/ci 将修改同步到CVS库里 cvs commit -m "write some comments here" file_name CVS的很多动作都是通过cvs commit进行最后确认并修改的。 在确认的前,还需要用户填写修改注释,以帮助其他开发人员 了解修改的原因。
add 向项目中添加文件/目录 cvs add new_file 添加文件之前应当首先创建文件,之后使用cvs add添加。添 加文件的操作只有经过cvs commit之后才真正被添加到代码库 中。对于图片,Word文档等非纯文本的项目,需要使用 cvs add -kb 选项按二进制文件方式导入(k表示扩展选项,b表示 binary),否则有可能出现文件被破坏的情况。
remove/rm 从项目中删除文件 cvs remove file_name 删除时,应当先将某个源文件物理删除后,再使用remove命令。 比如: rm file_name cvs remove file_name 然后commit确认删除。 也可以加上-f参数将两步合一: cvs remmove -f file_name cvs commit -m "why delete file" cvs不允许删除目录,空目录在update时会依选项自动忽略。
log/history 查看修改历史 cvs log file_name
diff 查看文件不同版本的区别 cvs diff -r1.3 -r1.5 file_name 查看1.3版本何1.5版本的区别 cvs diff file_name 查看本地和库中文件的区别
tag 标记版本号 cvs tag release_version CVS自动维护每个文件的版本号,文件每修改一次,则其版本 号自动增加。此版本号不能用作阶段性发布使用。tag命令为 当前目录下所有文件标记一个统一的发行版本号。 如: cd blob/ cvs tag 2.1.0-Hornworks tag命令应当由项目负责人统一指定和使用。
export 项目发布, 导出不带CVS目录的源文件 本地代码树的每个目录下,CVS都创建了一个CVS/目录用于记 录当前目录和CVS库之间的对应信息。export可以导出不包含 CVS目录的代码树。 cvs export -r release project_name 导出版本号标记为 release的代码 cvs export -D 20021023 project_name 导出截至2002.10.23时最新的文件