LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1207|回复: 1

用 SVK 管理源代码

[复制链接]
发表于 2005-12-24 14:45:48 | 显示全部楼层 |阅读模式
用 SVK 管理源代码

时至今日,一般的开发人员对于 SCM 的概念都已经不陌生了,但用什么样的工具来做 SCM 却依然是一个问题。开源的 SCM 工具有 CVS、Subversion、GNU Arch 等等,不同的工具的用法虽然不尽相同,但其概念都是相同的,它们都是要帮助软件开发者管理软件的一系列版本。在众多的 SCM 软件中,有一款却显得与众不同,它并没有要成为 SCM 的核心,而是想要做核心以外的其它各种事情,这就是 SVK。

SVK 出世

很多自由软件的作者在最初开发这个软件时,都是在给自己“搔痒”,SVK 也不例外。SVK 的作者 ChiaLiangKao 编写 SVK 的原因是因为当他在休假时,无法通过度假村的垃圾网络连接到他的 SCM 服务器上。这就意为着他不能将自己每天的工作保存起来,也不能借助 SCM 的能力来完成其它的事情。一般的人或许就去忍受这种煎熬了,但 ChiaLiangKao 却想到要编写一个更好程序来帮助自己,于是 SVK 诞生了。

SVK 是什么

SVK 是一个构架于 Subversion 文件结构之上的 SCM 工具。那么它和 Subversion 之类的软件有什么不同呢?简单的说,Subversion 的目标是编写一个可以管理项目源代码的工具,它允许网络上的开发者方便地完成协同开发,Subversion 的用户通常是一个软件开发团队。而 SVK 的最初目标则是一个可以在本地保存源代码库镜像的工具,通过这个工具,可以让用户更即便是在没有网络地情况下都能方便地使用 Subversion 等版本控制工具提供的功能。

随着 SVK 的逐步完善,它的功能也越来越强大。除了用于源代码库的镜像,SVK 可以完成的事情已经越来越多了。譬如对于不需要协同开发的用户而言,可以直接使用 SVK 来管理自己的源代码;对于匿名使用 CVS 的用户,通过 SVK,还可以在保存自己对源代码所做的修改的同时,方便地追踪 CVS 的最新版本等等。

在 SVK 镜像上工作

以下的部分都假定用户已经安装好了 SVK,如果还没有安装好,那就 apt-get 一个吧。

正如 SVK 最初的设计原因,SVK 最有用的一个功能就是将远程的源代码库镜像到本地。当源代码库镜像好之后,用户可以对本地的源代码库镜像进行各种修改操作,然后再将本地源代码库镜像中所有的改动一并提交到远程的源代码库中。这样做最大的好处就是降低了在开发过程中对于网络的依赖,即便是在网络环境很差或者没有网络的情况下,一样可以在本地的源代码库镜像中保存下自己的工作。对于高水平用户而言,这样做的另外一个好处就是可以随意对版本库中的任何一个版本进行快速操作。

好了,不再说废话,我们看看如何用 SVK 做备份:

初始化本地的代码库

在用 SVK 做任何事情之前,都必须先初始化以下 SVK 本地的代码库。缺省情况下,这个代码库位于 ~/.svk/local 中,用如下命令便可以初始化:

   
  1. svk depotmap --init
复制代码


如果你希望修缺省改代码库的位置,可以用

   
  1. svk depotmap
复制代码


并在编辑器中为它设定好新的位置。本地代码库可以有多个,但通常情况下都只要使用一个就足够了,这样对此代码库的引用也比较简单,只要使用“//”就可以了。

为远程代码库做镜像

我们假设远程的代码库使用的是 Subversion,由于 SVK 是在 Subversion 的文件结构上搭建的,因此其概念与 Subversion 非常接近,有时间可以仔细看看 Subversion 的使用手册,相信也会对使用 SVK 有很大的帮助。当然我并不是说 SVK 只能支持 Subversion,它对很多种 SCM 工具的支持都是不错的。

   
  1. svk mirror http://svn.foo.com/repo/myproject //mirror/myproject
复制代码


在这里,//mirror/myproject 就是本地代码库中的路径,把镜像放在“//mirror”目录中,是一种比较好的使用策略。上面的命令只是将本地的一个目录和远程的代码库关联起来,还并没有下载代码库中的代码。下面的命令可以完成下载的操作:

   
  1. svk sync //mirror/myproject
复制代码


这个命令的运行时间会比较长,它会把远程源代码库中所有的内容都镜像到本地。

创建本地分支

镜像完成后,我们是不是就马上可以对这个代码库镜像进行操作了呢?稍等一下。我们前面提到,mirror 命令实际上是在本地代码库和远程代码库之间建立了关联,这个关联实际上意味着对于 //mirror/myproject 的所有写操作,都会直接反应到 http://svn.foo.com/repo/myproject 上。因此,如果我们直接对这个镜像进行写操作,一样是需要依靠网络的。那么怎么办呢?我么需要给本地的镜像做一个本地分支,并在这个分支上进行相应的操作。待网络条件允许时,再将此分支上的内容 merge 回本地镜像中,这样自然也就提交到了远程的代码库中。

在创建分支前,我们首先创建一个目录来保存本地的分支,当然这不是必须的,我们也可以将这个分支放在代码库的根目录上。

   
  1. svk mkdir //local
复制代码


然后我们在这个目录中创建分支:

   
  1. svk cp //mirror/myproject //local/myproject
复制代码


从 SVK 中取出代码

在创建本地分支后,我们就可以在其上进行任何操作了,譬如取出代码:

   
  1. svk co //local/myproject/trunk myproject
复制代码


向 SVK 提交

在对代码进行了修改后,可以将其提交到 SVK 代码库的本地分支上:

   
  1. svk ci -m "log messgae" hello.cpp
复制代码


更新本地镜像

远程的代码库会有很多用户访问,如果其它人在你做了镜像之后修改并提交了代码,那么我们就必须将其更新到我们自己的本地代码库镜像中来,使用如下命令:

   
  1. svk sync //mirror/myproject
复制代码


然后将其合并到本地分支上:

   
  1. svk smerge //mirror/myproject //local/myproject
复制代码


提交到远程代码库

在进行了一系列的修改后,就可以则机提交到远程代码库了。在提交前,首先还是要更新本地镜像,以保证在提交时不会有冲突:

   
  1. svk sync //mirror/myproject
复制代码


然后可以尝试着提交自己的修改:

   
  1. svk smerge -C //local/myproject //mirror/myproject
复制代码


由于添加了“-C”选项,上面的命令只是做一下检查,并不会真的提交。如果没有冲突,就可以提交了。在提交时,可以根据需要添加其它选项,如“-I”、“-l”等:

   
  1. svk smerge -I -l //local/myproject //mirror/myproject
复制代码


SVK 的其它用法

SVK 的用法还有很多:当只有一个人开发时,它可以直接作为管理代码的 SCM 工具;当从一个 SCM 迁移到另一个 SCM时,利用 SVK 可以有效地保存下所有的历史日志;当几个人同时要访问一个远程的代码库时,利用 SVK 可以制作一个在本地服务器上共享的源代码库镜像。

任何一个工具都只是提供了一个功能,而怎么把它用好,则要发挥用户的主观能动性了。

A Tip

一般向远程的 Subversion 服务器提交数据都需要使用用户名和密码,缺省情况下,SVK 认为远程服务器上的用户名与本地的用户名相同。但如果此用户名不同,可以通过设置环境变量 USER 来指定远程服务器上使用的用户名。

更多信息

关于 SVK 的更多信息,请访问其 Wiki: http://svk.elixus.org/
发表于 2005-12-24 17:13:27 | 显示全部楼层
好贴!学习学习ing。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表