我最近和一个在他们的项目中使用ZendFramework的人一起工作。为了保持稳定和可发布,他将框架导出到他的存储库中并签入。由于当前ZF项目中的文件更改如此之多,他没有从签出到他自己的存储库中执行rsync,而是决定删除该目录从存储库中,并在他每次更新框架时重新添加它。
这对我来说似乎真的很低效,特别是考虑到将他的开发分支的更改合并到他的生产分支变得非常困难(删除和重新添加目录会大大破坏合并过程)。我知道必须有更好的方法。
我以前听说过svn:externals
属性,但从未真正使用过它。事实证明,它正是针对这种情况而存在的。问题是SVN书中svn:externals的文档根本没有说明应该如何设置该属性,而且我读过的大多数指南都忽略了一个或多个非常重要的细节。通过自己的反复试验,我终于弄明白了,所以我将分享这个过程,希望其他人也能从中吸取经验。
其实很简单。这假设您的项目布局看起来像这样:
project/ branch/ production/ tag/ trunk/
-
在项目主干的顶部,执行以下命令:
$ svn propedit svn:externals .
-
这将打开编辑器会话。在您的编辑器打开的文件中,每一行表示要提取的不同外部svn存储库。该行的第一段是您希望拉取所在的目录。最后一段是要拉取的svnrepoURL。您可以有一个可选的中间参数,指示要使用的修订版。一些例子:
-
从head中提取框架repo:
framework http://framework.zend.com/svn/framework/trunk
- 从revision中提取框架repo2616:
framework -r2616 http://framework.zend.com/svn/framework/trunk
-
-
保存退出后更新repo:
$ svn up
-
提交更改:
$ svn commit
需要注意的一件事:您为svn:externals
checkout指定的任何目录都应该不已经存在于您的存储库中。如果是这样,您将收到如下错误:
svn: Working copy 'sharedproject' locked svn: run 'svn cleanup' to remove locks
我在上面展示了使用修改;您还可以通过简单地从给定标签检出外部存储库来固定标签。两种方式都很好。
然后,当从一个分支移动到另一个分支,或从主干移动到一个分支时,您只需为每个分支设置不同的svn:externals
。例如,您当前的作品可能会从一个特定的版本开始检查,但您的躯干可能只是跟踪头部;然后,您只需确定您的主干上正在使用的当前修订版本,并在您准备好推送更改时更新生产分支中的svn:externals。
希望这对你们中的一些人有帮助!