在svn中提供了一个非常好的功能叫做外部定义,简单的说就是可以把外部的svn版本库映射到一个目录。这是一个本身很简单的功能,但是他却能给svn的使用和管理带来很多多变的功能。

首先详细的解释一下外部定义这个功能吧。我们用一个用户的使用场景来说明一下。说的尽量的详细,所以比较啰嗦:)。
假设现在有两个团队,一个是开发组(dev-team),一个是文档组(doc-team),共同开发一个产品。这两个小组各自有各自的管理等等原因,所
以分开使用svn比较好,所以共有两个svn版本库,dev-svn和doc-svn。我们假设这两个版本库都使用标准的组织结构(详细对组织结构的讨论
请看以后的文章),现在的开发都是在trunk进行的。开发组,trunk下的目录组织为src,lib,build等等。
对于两个小组的开发,测试,管理,分开使用没有任何问题,也不会相互的有影响。但是面对最终产品发布的时候,要做安装程序,这时候就必须同时操作两个项
目。而很明显的一个普遍的组织结构就是doc-team开发的文档作为dev-team开发的程序等等的一部分。那么在dev-svn的trunk下,就
应该有一个叫做doc的目录,目录的内容是doc-svn的trunk的内容。
此时,我们就可以利用svn的外部定义功能来完成这个任务。svn的外部定义,其实是给(父)目录加上的一个 属性(svn properties,详情后文介绍),这个属性定义了要引用哪个外部的版本库并且放在(父)目录下的哪个(子)目录中。
给父目录添加一个叫做svn:externals的属性,属性的内容是doc-name svn-url,svn-url表示要引用哪个svn的连接,doc-name表示这个引用放在哪个目录下
在上面的场景中,我们要给dev-svn的trunk目录设置一个属性sv:externals,属性的值是doc

http://doc-svn/trunk,这样当你设置完之后,update一下本地工作区,biu的一下,doc就过来了,这时候从dev-svn的

trunk的角度看,就有了完整的内容,包括doc。
完整的命令是,在chechout下来的dev-svn的trunk目录下
#svn propset svn:externals “doc http://doc-svn/trunk” .
propset,表示使用propset命令,添加属性
svn:externals,表示要添加svn:externals属性
“doc http://doc-svn/trunk”,表示要给这个属性添加的值,因为这个属性包含空格,所以要用双引号括起来
之后的点,表示要把这个属性添加在本目录上

啰嗦了一通,想必大家看的也是云山雾罩的,自己做个试验就可以了。

一些高级的外部定义的用法,我们对一个目录不但可以定义一个外部定义,还可以定义多个。比如doc来自doc-svn,website来自web-svn等等。这时候我们需要把这些东西都作为svn:externals的属性值。
doc http://doc-svn/trunk
website http://web-svn/trunk
注意!这里是需要换行的,这个对于命令行来说,是非常痛苦的,而且外部定义这种值里面还包含空格的需要用双引号括起来的值来说,就是痛苦死了。好吧,我承认我到现在也没有成功的设置过。怎么办?好吧,我们可以用另外的方法来搞定。
svn propset这个命令可以使用一个外部文件的文件内容作为给属性添加的值。命令如下
svn propset svn:externals -F filename .
所以,一般的,凡是需要用到这类用法的地方,我都会生成一个文件叫做LINKS,放到svn上管理。LINKS的内容如下
doc http://doc-svn/trunk
website http://web-svn/trunk
这样我们就可以使用svn propset svn:externals -F LINKS . 这个命令来设置了。

对属性的替换,直接set一个其他的值就好了。可是,如果我们不想要这个外部定义了怎么办?注意!这里千万不能使用svn del命令(比如在dev-svn的trunk目录下执行svn del doc),这样你删除的不是这个外部定义,而是你引用的svn版本库的内容。如果很幸运的,你是在另外的项目有写入的权限,好了,恭喜你,你已经把那个项目咔嚓掉了。
正确的做法是使用svn propdel命令来删除掉svn:externals这个属性
svn propdel svn:externals

最后还要提醒一点,这个属性是放在这个目录上的,对于svn来说,目录也是受到管理的,目录和目录内的文件之类的是不同的。所以你如果只想对这个目
录进行操作,而不像对它下面的文件进行操作,使用svn的时候,记得加上-N参数。比如类似svn:externals这样的属性就是针对目录的。

其实外部定义,还有很多的高级的使用功能,具体的我就不详述了,请参阅svn的帮助或者阅读文档,http://svndoc.iusesvn.com/svnbook/1.2/svn.advanced.externals.html。 最新的文档(针对1.4,1.5的)是英文的,嘿嘿。

外部定义还有一些玩法,更多的还是在使用在基于svn管理的项目组织上,这个我会在以后的文章进行说明。