3

我们有一个 Subversion 设置,它相当广泛地使用了 svn:externals(一个项目中有超过 5 个外部引用,虽然大多数在同一个存储库中,但一两个在不同的存储库中但仍在同一服务器上)。目前,svn:externals 属性的设置方式是它们具有引用项目的完整 URL(即“https://[server]:[port]/svn/Repository1/Projects/...)

最近,我使用 svnsync 设置了一个 SVN 镜像,它将我们的存储库备份到外部异地设施。我们需要能够从远程站点的那些镜像存储库中进行只读检出,这似乎在大多数情况下都可以正常工作,除非它尝试拉取外部文件时,它仍然引用我们的本地现场服务器。

不确定这是否是最好的方法,但我想在远程位置设置某种 post-commit 钩子,它会修改 svn:externals 的属性并在这里替换我们本地服务器的主机名那里的远程服务器的主机名。这个钩子会在 svnsync 每次提交之后运行。

理想情况下,我们希望避免在主存储库中修改 svn:externals 属性以不包含服务器名称。

有没有人遇到过这个问题?最好的方法是什么?

4

2 回答 2

4

您必须了解这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

我同时标记project1project2。现在,我svn:external指的是http://vegibank.com/svn/tags/1.2.3/project2/foo.

您需要的是一种以这种方式强制执行 svn:externals 的方法,并且您可以使用预提交挂钩来拒绝任何具有svn:external引用trunkorbranches目录的集合的提交,而无需指定实际修订。

于 2013-03-14T04:05:11.453 回答
1

你运行的是什么版本的svn?如果您是最新的,您可以避免将主机名放入svn:externals 阅读红皮书, 特别是检查从外部开始 /

你应该强烈考虑走出svn:externals困境......特别是如果链接指向同一个仓库......你的分支和标记更难。我见过很多 svn 实现,而 svn:externals 通常是难闻的气味。

此外,作为一般规则,我认为有一个提交后挂钩来改变开发人员的意图是次优的。虽然在这种情况下你可能会没事。

于 2013-03-13T23:16:53.117 回答