技术开发 频道

分布式版本控制

【IT168 技术文章】

    虽然我使用传统SCM(软件配置管理,或者叫RCS——版本控制系统)软件已经有很多年,从那个垃圾一般的VSS到功能强大的CVS和SVN都用过 一段时间,短则半年(VSS),长则数年(SVN)。但是对于分布式版本控制系统(DRCS),我也是刚接触不久,发现它们的确很不错,相比传统SCM来 说,是一种质的变化。

    所谓DRCS是相对于传统集中式的SCM而言的。对于传统SCM来说,Repository是集中在唯一的一个地方, 所有的用户进行commit或update以及其它的相关操作基本上都需要能够直接连接到这个Repository才能进行。这就会存在一些比较麻烦的问 题,就我个人的体会来说,常见的麻烦事在于(以下仅以CVS和SVN为例,至于VSS——不能为rubbish浪费时间):

    1、并不是所有的开发者都总能连接到Repository服务器,比如在没有网络连接或是网络连接受限的情况——当然SVN提供的HTTP访问方式部分解决了这种困难,但仍然不够。

    2、在团队协作开发中,当变更冲突增加以后,处理起来会比较麻烦。

    3、分支管理方面的功能还较弱。

    4、安全性问题。不论是用独立服务器方式还是HTTP方式,用户认证方式都相对简单,当然也可以配置得更安全,但比较麻烦。

    5、最后一个小问题就是:不论是CVS还是SVN,都会在工作目录的每个子目录里创建一个隐藏目录记录本地状态信息,比较烦人。

    而DRCS的目标就是尽可能解决传统SCM存在的不足之处——包括但不限于我上面所说的那些。就我目前试用过的两个DRCS——Bazaar和Mercurial——来说,上面的问题都解决得比较好:

    1、都可以在本地提供全部的版本控制功能,可以只在必要的时候合并更新到公共Repository中。

    2、因为是针对分布式开发设计,变更合并功能强大。

    3、分支管理功能同样强大。

    4、Bazaar支持SFTP方式的push,而Mercurial支持SSH方式的push,二者都是基于安全的通讯协议并且使用系统的用户管理机制,在保证安全性的同时保持了使用上的简单性。

    5、只在工作目录的顶层生成一个隐藏目录——就是本地Repository,保持了工作目录的清爽。

    显然,DRCS天生是为了开源项目而量身定制的——因为开源项目的开发者往往都是在地理上极度分散的,但又需要对源码进行有效的版本管理。但是对于其它的软件项目来说,DRCS也同样是个好东西,特别是其变更合并功能和分支管理功能。

    后面我会简单介绍一下我最近试用过的两款比较流行的DRCS——Bazaar和Mercurial。

    其实这两款DRCS在命令定义方面都是继承传统的,所以学习起来并没有太大的复杂性,并且具有很多的共性——二者除了程序名不一样以外,常用的命令和参数定义都几乎是完全一样的,甚至一些配置文件都是类似的。

    本篇介绍Bazaar

    我知道Bazaar是从livid那里看到的,他这篇介绍基本上就是翻译Bazaar官方的一个快速入门文档,强烈推荐参考一下。

    Bazaar的优点在于功能强大并且安装使用很方便。因为是用Python写的,只要在安装了Python之后,再安装一下Bazaar就可以使用了。需要注意的是,它的SFTP功能使用了两个包: pycrypto和paramiko。这是需要额外安装一下的。刚好我安装Bazaar的时候两个包的官方网站都不太正常(难道是RPWT?),最后只好通过GOOGLE找到别的镜像才下载到。

    Bazaar 的缺点是速度太慢。它的慢倒不是像云风所说的那样,对大项目太慢,而是因为它是纯python的程序,在windows下每次运行都要启动python环 境,所以每次输入命令都要等上一会儿才执行,对于像我这种经常用status命令检查的人或是那些用小步迭代的XP方式开发的人来说,比较难以忍受。

    据 说也有一个类似TortoiseSVN的ToroiseBZR,但是鉴于我对TSVN的使用经验来说,Windows的Explorer已经很不稳定了, 再加这个东东就不稳定得受不了了。所以我还是不用Tortoise了,再说用惯了命令行操作在很多时候比用Tortoise还方便。

    基本的使用方法参见前面链接的那篇livid翻译的快速入门吧。我这里只说一下远程Repository操作方面的问题。

    把本地Repository的更新提交到远程Repository可以通过SFTP,这也就意味着服务端是免安装免配置的,这一点我觉得实在是太方便了。

    bzr push sftp://jod@jod.example.com/public_html/foobar.joe/

    如果要从远程Repository取得一个本地副本,理论上也可以通过SFTP:

    bzr branch sftp://jod@jod.example.com/public_html/foobar.joe/

    不 过试用下来我碰到一个问题,通过SFTP作push是没有问题,但是如上面的命令作checkout或branch操作时,却只会下载一个本地 Repository的副本(.bzr目录),不会生成工作目录和文件。即使再用update也不行,不知道是不是我RPWT,还是下来的这个.bzr本 身就有问题。但换成HTTP就可以了:

    bzr branch http://jod.example.com/foobar.joe/

    但 这样就麻烦一些,一个是安全性的问题,当然可以用HTTP-Auth加上身份验证,但毕竟没有SFTP安全;另一个是需要在服务端作Web Server配置,允许通过HTTP访问远程Repository;第三个问题是HTTP是只读的,这样上传和下载需要使用不同的URL。

    Web Server端的配置倒不复杂,标准的WEB静态页面访问配置即可。例如(包含HTTP-Auth身份验证):

    Alias /bzr /home/bzr

    <Directory /home/bzr>

    Options FollowSymLinks

    AllowOverride FileInfo Indexes Limit

    Order allow,deny

    Allow from all

    AuthType Basic

    AuthName "Bazaar Repository Files"

    AuthUserFile /home/svn/svn-auth-dev

    Require valid-user

    </Directory>

    另外,可以使用.bzrignore文件从工作目录中忽略不需要加入管理的文件,参见这个介绍,这一点比以前用TortoiseSVN时要方便很多。用如下命令可以列出项目工作目录中被忽略掉的文件:

    bzr ignored

    还有,据云风说,Bazaar有一个巨大的优点就是智能重命名,避免了大量文件的remove/add操作,这的确是一个很大的优点,特别是对于大项目来说。

0
相关文章