您必须了解这svn:externals
是文件的属性,修改它们需要提交。如果您有一个mirror,并且您修改了svn:external
,那么您正在创建一个新的远程版本并破坏您的镜像。修订将不再排列。
尽管当时这似乎是一个不错的想法,但svn:externals
在项目中可能非常糟糕。想象一个这样的项目:
http://vegibank.com/svn/trunk/project1
我在这个目录上有一个svn:external
$ svn pset svn:external "^/trunk/project2/foo foo" .
我这样做是因为该foo
目录是多个项目的共享文件集。
现在,我为 project1 创建一个标签:
$ svn cp http://vegibank.com/svn/trunk/project1 http://vegibank.com/svn/tags/1.2.3
看起来不错——除了project1/foo
目录没有标记。它与project2/foo
.
我对标签的假设是标签永远不会改变,但这不是真的。主干上的工作仍在进行中project2/foo
,这改变了我的标签所代表的内容。如果我在 1.2.3 版中有一个错误,并且我决定检查我的标签以查看可能是什么问题,我不一定会得到我发布的内容project1/foo
——我从主干获得最新的。
处理此问题的更好方法是创建一个发布存储库,将各种项目之间通用的代码构建为某种预编译的工件,并让您的项目依赖于该工件的该版本。它最终与依赖于特定版本的 C 程序libz.so
或依赖于 .1.6 版本的 Java 项目没有什么不同org.apache.commons.httpd
。
这将消除镜像的使用svn:externals
并简化您的镜像。您可以镜像发布存储库以及源存储库。
如果您坚持使用svn:external
,请不要使用完整的 URL。相反,使用相对 URL。
例如,如果你在上面设置了 `svn:external 而不是这个:
$ svn pset svn:external "^/trunk/project2/foo foo" .
去做这个:
$ svn pset svn:external "../project2/foo foo" . #property on ^/trunk/project1
现在,如果我创建这样的标签:
$ svn cp http://vegibank.com/svn/trunk http://vegibank.com/svn/tags/1.2.3
我同时标记project1
和project2
。现在,我svn:external
指的是http://vegibank.com/svn/tags/1.2.3/project2/foo
.
您需要的是一种以这种方式强制执行 svn:externals 的方法,并且您可以使用预提交挂钩来拒绝任何具有svn:external
引用trunk
orbranches
目录的集合的提交,而无需指定实际修订。