自动版本化

Posted on Posted in 附录c

自动版本化

因为Subversion客户端不是完整的DeltaV客户端,Subversion服务器也不是完整的DeltaV服务器,但仍有值得高兴的交互特性:叫做自动版本化。

自动版本化是DeltaV标准中的可选特性,一个典型的DeltaV服务器会拒绝一个对版本控制之下文件的PUT操作,为了修改一个版本控制下的文件,服务器只会接受一系列正确的版本请求:例如MKACTIVITYCHECKOUTPUTCHECKIN。但是如果DeltaV服务器支持自动版本化,服务器可以在后台假装客户端执行了一些列正确的版本请求,也就是说,DeltaV服务器可以与一个对版本化一无所知的普通WebDAV客户端交互。

因为有许多操作系统已经集成了WebDAV客户端,这个特性的用例可能是这样的:假设一个办公室有许多使用Microsoft Windows或Mac OS的普通用户,每个用户“装载”了一个Subversion版本库,看起来就是普通的网络共享文件夹。他们像普通目录一样的操作这个目录:打开文件、编辑它们,保存它们。同时,服务器自动的版本化所有的东西,任何管理员(或有知识的用户)可以一直使用Subversion客户端来查询历史来检索旧版本的数据。

这个场景不是小说:对于Subversion 1.2来说,是真实的和有效的。为了激活mod_dav_svn的自动版本化,需要使用httpd.conf中Location区块的SVNAutoversioning指示,例如:

<Location /repos>
  DAV svn
  SVNPath /path/to/repository
  SVNAutoversioning on
</Location>

     

当激活了SVNAutoversioning,来自WebDAV的客户端请求会导致自动提交,每个修订版本会自动附加一个原始的日志信息。

然而,在激活这个特性之前,需要理解你做的事情。WebDAV会做许多写请求,导致了产生数量非常多的自动提交修订版本。例如,当保存数据,许多客户端会使用一个PUT一个0字节的文件,然后紧跟一个PUT真实的文件数据。一个单独的文件写操作产生了两个不同的提交。考虑到许多应用程序隔几分钟的自动保存,会产生更多的提交。

如果你有发送邮件的post-commit钩子程序,例如,你会根据是否有价值来开启和关闭邮件通知,另外,一个聪明的post-commit钩子也应该能够区分自动版本化和svn commit产生的事务。技巧就是检查修订版本的svn:autoversioned属性,如果有,则提交来自一个原始的WebDAV客户端。

另一个作为SVNAutoversioning特性补充的特性来自Apache的mod_mime模块,如果一个原始的WebDAV客户端在版本库添加了一个新文件,用户就没有机会设置svn:mime-type属性,这会导致使用WebDAV共享目录查看时会看到原始的图标,而没有关联到任何应用。一个补救办法就是让系统管理员(或其他理解Subversion)的人检出一份工作拷贝,然后为需要的文件手动设置svn:mime-type属性,但是这个整理工作永远不会结束,作为替代,你可以在你的Subversion<Location>区使用ModMimeUsePathInfo指示:

<Location /repos>
  DAV svn
  SVNPath /path/to/repository
  SVNAutoversioning on

  ModMimeUsePathInfo on

</Location>

     

这个指示允许mod_mime在使用自动版本化添加新文件时尝试自动检测新文件的mime-type,这个模块查看文件的扩展名,有可能的话还包括检查内容;如果文件符合某个常用模式,就会自动设置文件的svn;mime-type