在预提交脚本中,是否有可能(如果是,如何)识别源自svn merge
的提交?
svnlook changed ...
显示已更改的文件,但不区分合并和手动编辑。
理想情况下,我还想区分标准merge
和merge --reintegrate
。
我正在探索使用预提交挂钩为我们的项目强制执行SVN使用策略的可能性。
其中一个策略声明某些目录(例如/trunk
)不应直接修改,只能通过功能分支的重新集成进行更改。因此,预提交脚本将拒绝除分支重新集成之外对这些目录所做的所有更改。
有什么想法吗?
我已经探索了svnlook
命令,而我最接近的是检测并解析对目录的svn:mergeinfo
属性的更改。这种方法有一些缺点:
svnlook
可以标记属性的更改,但不会更改哪个属性。 (需要使用前一版本proplist
的差异)svn:mergeinfo
中的更改,可以检测到svn merge
已运行。但是,无法确定提交是否纯粹是合并的结果。合并后手动进行的更改将不会被检测到。 (相关文章:Diff transaction tree against another path/revision)答案 0 :(得分:2)
不幸的是,subversion不会强制执行仅提交合并
如果我有权访问分支,我可以在合并之后和提交之前做任何事情
还在客户端进行了颠覆合并
许多代码存储库工具将在服务器上合并。即强制您只将补丁从一个流移动到另一个流
答案 1 :(得分:2)
我最终采用了一种非理想的解决方案,即检测更改树顶层目录中svn:mergeinfo
属性的更改(在SVNTransaction.is_merge_operation()
中实现)。
我们无法区分仅包含合并的提交和包含其他更改的提交。这意味着如果与合并一起提交,则在该树下发生的所有更改都将不会被检测到。一种可能的解决方案可能是将事务树与合并源进行区分,但I have not figured out how to achieve that yet(这也需要考虑冲突解决后的更改)。
它也无法区分merge
和merge --reintegrate
。
其他限制包括依赖svn:mergeinfo
用户可修改且未在旧版本的subversion中使用。
有问题的提交脚本是一个温和的提示,用于标记违反项目指南而不是访问控制机制的提交,因此上面列出的限制不是显示阻止。但是,我仍然在寻找改进方案。 欢迎提出意见和建议。