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

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

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

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

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

有帮助吗?

解决方案

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

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

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

其他提示

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

$SVNLOOK changed -t “$TXN” “$REPOS” | egrep -v “^[AD][[:space:]]+(.*/)?tags/[^/]+/<*>#8221; | egrep “^[^[:space:]]+[[:space:]]+tags/[^/]+/.+”
if [ $? -eq 0 ] ; then
echo >&2 “***************************************”
echo >&2 “* Modification of tags is not allowed *”
echo >&2 “***************************************”
exit 1
fi

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top