如何禁止向svn:external提交版本的Subversion提交?

5
我们使用 svn:externals 来指定库的特定版本,例如:
xyzlib -r12345 https://asdf.asdf.local/xyzlib/trunk/

当您在工作副本中对已检出的外部进行修改时,即使外部链接到特定版本而不是HEAD,也有可能提交。
当您在提交后运行svn update时,更改将在工作副本中消失,因为Subversion会将所有内容恢复到版本12345。因此,您从未真正看到自己的更改,但它们仍然存在于HEAD中,这很糟糕。
是否可能仅在外部指向非HEAD版本时禁止提交?

“commit to these externals” 是什么意思?有人提交到 https://asdf.asdf.local/xyzlib/trunk/ 吗?HEAD 包含了哪些修改? - Hank Gay
我稍微重新表述了一下问题。 - martinus
4个回答

3
对于这些验证,我建议使用一个 pre-commit 钩子,但是不要编写容易难以理解的脚本,我推荐使用类似 SVNKit 的库 - http://svnkit.com/(如果你知道 Java)。
我自己使用这个库编写了一些 pre-commit 钩子,它非常容易使用。您可以编写一个小的可运行的 Java 程序,由 Subversion 调用 pre-commit 钩子。然后,您可以轻松提取例如属性或 URL 的部分来进行验证,并且如果提交不符合您的“规则”,则拒绝提交。
请查看 SVNLookClient 和 SVNChangeEntry 类 - 它们具有最常见情况的方法(例如提取正在进行的提交的信息)。

2
您可以尝试这样做:使用一个 pre-commit脚本检查提交是否将要标记。如果是,则失败并提供消息。阅读有关svn挂钩的更多信息。您必须重新编写正则表达式,以使其在不是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

2

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


嗯,我不太喜欢这个,因为当我切换到可写URL的HEAD时,所有文件都必须被删除并重新检出。 - martinus
1
所以你要将svn:external切换到不同的版本?我以前从未尝试过切换,但我不认为它会强制删除工作副本。 - Mike Miller
2
我猜问题在于它不会切换,下一次更新后仍将是r12345。提交的更改将进入HEAD(或因冲突而失败)。无论如何,这都不是提交开发人员的意图。 - Eugene

1
如果您不打算将外部定义保持为主干的修订版本,为什么不基于该修订版本创建一个新标签呢?然后,您可以让svn:external指向该标签,并使用其中一种记录的访问控制方法来限制提交到您的标签目录(或将标签放在不同的存储库中并使该存储库只读)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接