5

我们将 svn:externals 用于库的特定修订,例如

xyzlib -r12345 https://asdf.asdf.local/xyzlib/trunk/

当您在工作副本中对此类签出的外部进行修改时,即使外部链接指向特定修订而不是 HEAD,也可以提交。

当您svn update在提交后运行时,更改将在工作副本中消失,因为 subversion 会将所有内容恢复到修订版 12345。因此您自己永远不会真正看到更改,但它们仍然在 HEAD 中,这很糟糕。

是否可以仅在外部不指向 HEAD 修订时才禁止提交?

4

4 回答 4

3

对于这些类型的验证,我还建议使用 pre-commit 钩子,但我建议使用像 SVNKit 这样的库 - http://svnkit.com/(如果你了解Java)。

我使用这个库自己编写了一些预提交钩子,使用起来非常容易。你编写了一个可运行的小型 Java 程序,它被 Subversion 从 pre-commit 钩子调用。然后很容易提取例如属性或 URL 的一部分来进行验证,如果它不适用于您的“规则”,则拒绝提交。

看看 SVNLookClient 和 SVNChangeEntry 类——它们有用于最常见情况的方法(例如,提取有关正在进行的提交的信息。)

于 2010-01-05T16:02:33.157 回答
2

您可以尝试这样的事情:使用预提交脚本来检查提交是否要发送到标签。如果是这样,则失败并提供消息。阅读更多关于颠覆钩子的信息。您必须重新编写正则表达式,以便它在不是 HEAD 时失败,而不是在标签时失败。

$SVNLOOK changed -t “$TXN” “$REPOS” | egrep -v “^[AD][[:space:]]+(.*/)?tags/[^/]+/$” | egrep “^[^[:space:]]+[[:space:]]+tags/[^/]+/.+”
if [ $? -eq 0 ] ; then
echo >&2 “***************************************”
echo >&2 “* Modification of tags is not allowed *”
echo >&2 “***************************************”
exit 1
fi
于 2010-01-04T21:08:52.070 回答
1

由于您使用的是 https,我假设您使用的是mod_dav_svn. 您可以为您的库存储库设置一个额外的 url,并且只授予对它的只读访问权限。这样,即使是通常可以提交到库的开发人员,也无法通过 svn:external 提交。

于 2009-06-16T13:25:41.780 回答
1

如果您不承诺将外部定义为主干的修订版,为什么不根据该修订版制作一个新标签。然后,您可以将 svn:external 指向标签,并使用其中一种记录在案的访问控制方法来限制对标签目录的提交(或将标签放在不同的 repo 中并使该 repo 只读)。

于 2010-01-05T05:17:22.017 回答