如何禁止subversion提交到svn:external to revisions?

时间:2009-06-16 13:07:54

标签: svn permissions svn-externals

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

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

当你在工作副本中修改这样一个已检出的外部时,即使外部链接到特定修订而不是HEAD,也可以提交。

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

只有当外部没有指向HEAD修订版时才可以禁止提交吗?

4 个答案:

答案 0 :(得分:3)

对于这些类型的验证,我还建议使用预提交钩子,但不是编写一个很容易理解的脚本,而是建议使用像SVNKit这样的库 - http://svnkit.com/(如果你知道Java)。

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

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

答案 1 :(得分:2)

您可以尝试这样的事情:使用pre-commit script检查提交是否转到标记。如果是,则失败并提供消息。 Read some more about subversion hooks.你必须重新编写正则表达式,这样如果它不是HEAD就会失败而不是失败if if是一个标记。

$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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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