2008年4月30日星期三

学会使用svn:externals

最近在与人合作的项目中使用了Zend Framework。为保证项目稳定性和方便发布,合作者把框架导出(export)到他的版本库然后提交(check in)。因为ZF框架的文件大量频繁的更新,他放弃了从框架版本库导出(export)的本地版本库同步到版本控制服务器上的办法,每次更新框架的时候都从版本库中删除框架然后重新添加,

这在我看来是在是低效的,特别是考虑到这会让他从开发分支合并到产品分支非常困难。(删除并重新添加目录会在一定成都影响合并)我想会有更好的办法。

曾经听说过svn:externals属性,但是从来没有使用过。既然有这个属性,肯定有一个适合运用他的条件。问题是SVN电子书中 svn:externals说明文档 部分并没有说明这个属性该怎样设置,而且我发现很多”怎么做”条目都省去了一个或多个重要的细节。通过一些实验、排除一些自己的错误,最后我终于知道怎么弄了。因此我现在来分享这个处理过程,希望大家也能够从这次经历中得到经验。

事实上相当容易,假设你的你的项目文件系统结构想下面这样子:

project/ branch/ production/ tag/ trunk/

* 在trunk目录下执行如下命令:

svn propedit svn:externals .

* 运行命令后会调用编辑器编辑属性。在编辑器打开的文件中,每行代表一个你要从那里取得代码的不同的外部svn仓库。一行中的第一段代表你想让取回代码存放的目录,最后一部分是取得代码的svn版本库URL。中间你还可以用一些可选配置参数来决定要取回的版本。以下是一些例子:
o 取得Zend Framework仓库的当前版本(head)::

framework http://framework.zend.com/svn/framework/trunk

o 取得Zend Framework仓库的版本2616:

framework -r2616 http://framework.zend.com/svn/framework/trunk

* 保存文件退出编辑器,更新版本库:

svn up

* 提交所做更改:

svn commit

请注意一点:在svn:externals中设置的取出代码存放目录在不能是你的版本库中已经存在的目录。如果存在,你会得到如下错误提醒:

svn: Working copy 'sharedproject' lockedsvn: run ’svn cleanup’ to remove locks

上面的例子中我使用的是版本,你也可以使用标签来取得外部仓库中特殊标签的版本。两种方法都能很好的工作。

现在,当我们实现分支之间或从主干到分支之间的转换时,你可以为每个分支设置不同的svn:externals属性。例如,你当期那的产品环境可能从某个特殊的版本中取出,但是你的主干需要跟进最新版本(head)。当你觉得可以实施这些改变的时候,你需要做的仅仅是查到主干的版本号然后更新产品版本的svn:externals属性即可。

希望这能帮祝你了解svn:externals。

没有评论: