在预提交脚本中检测分支重新集成或合并

时间:2012-01-09 15:17:57

标签: svn pre-commit-hook svnlook svn-merge svn-merge-reintegrate

在预提交脚本中,是否有可能(如果是,如何)识别源自svn merge的提交?

svnlook changed ...显示已更改的文件,但不区分合并和手动编辑。

理想情况下,我还想区分标准mergemerge --reintegrate

背景

我正在探索使用预提交挂钩为我们的项目强制执行SVN使用策略的可能性。

其中一个策略声明某些目录(例如/trunk)不应直接修改,只能通过功能分支的重新集成进行更改。因此,预提交脚本将拒绝除分支重新集成之外对这些目录所做的所有更改。

有什么想法吗?


更新

我已经探索了svnlook命令,而我最接近的是检测并解析对目录的svn:mergeinfo属性的更改。这种方法有一些缺点:

  1. svnlook可以标记属性的更改,但不会更改哪个属性。 (需要使用前一版本proplist的差异)
  2. 通过检查svn:mergeinfo中的更改,可以检测到svn merge已运行。但是,无法确定提交是否纯粹是合并的结果。合并后手动进行的更改将不会被检测到。 (相关文章:Diff transaction tree against another path/revision

2 个答案:

答案 0 :(得分:2)

不幸的是,subversion不会强制执行仅提交合并

如果我有权访问分支,我可以在合并之后和提交之前做任何事情

还在客户端进行了颠覆合并

许多代码存储库工具将在服务器上合并。即强制您只将补丁从一个流移动到另一个流

答案 1 :(得分:2)

我最终采用了一种非理想的解决方案,即检测更改树顶层目录中svn:mergeinfo属性的更改(在SVNTransaction.is_merge_operation()中实现)。

我们无法区分仅包含合并的提交和包含其他更改的提交。这意味着如果与合并一起提交,则在该树下发生的所有更改都将不会被检测到。一种可能的解决方案可能是将事务树与合并源进行区分,但I have not figured out how to achieve that yet(这也需要考虑冲突解决后的更改)。

它也无法区分mergemerge --reintegrate

其他限制包括依赖svn:mergeinfo用户可修改且未在旧版本的subversion中使用。

有问题的提交脚本是一个温和的提示,用于标记违反项目指南而不是访问控制机制的提交,因此上面列出的限制不是显示阻止。但是,我仍然在寻找改进方案。 欢迎提出意见和建议。