1

我们有以下环境:带有 Apache 2.2.14 和 SVN 1.6.6 通过 WebDAV 的 Windows 2008 服务器。多个开发人员从不同的 Windows 平台提交 Java 代码。

现在我们要在我们的存储库中实现一个预提交钩子,在提交的代码上运行 Checkstyle。为此,我们使用 SVNChecker ( http://svnchecker.tigris.org/ ),效果很好。不幸的是,当 Checkstyle 报告错误时,报告中的行号是实际行号的双精度值。

当您在 SVN 中提交某些内容时,它会创建一个包含新文件的临时目录。然后,运行预提交挂钩,如果成功,新文件实际上会提交到存储库。我在十六进制编辑器中分析了这些临时文件,发现所有换行符 (\n) 都替换为回车符和换行符 (\r\n)。当我们在文件中使用 Windows 换行符 (\r\n) 时,这导致了 \r\r\n,这被 Checkstyle 和几个文本编辑器视为两个换行符。奇怪的是,从我们的存储库中签出时换行符是正确的,因此它们以某种方式被转换回某个地方。

我可以通过将属性 svn:eol-style (参见http://svnbook.red-bean.com/en/1.1/ch07s02.html#svn-ch-7-sect-2.3.5)设置为 native来解决这个问题. 那时一切正常。不幸的是,对我们来说,这意味着我们必须将此属性添加到存储库中的每个文件中。据我所知,SVN 客户端中有一个设置会在您添加新文件时自动执行此操作,但不幸的是,我们无法告诉所有开发人员将此设置添加到他们的 SVN 客户端。

eol 样式属性的描述说“默认情况下,Subversion 不会注意文件中使用的行尾 (EOL) 标记的类型”。对我来说,它看起来像 SVN 中的一个错误,尽管如此,换行符被转换了。

有谁知道如何在不使用丑陋的解决方法(例如手动将换行符转换回预提交挂钩)的情况下解决此行为?

谢谢你的帮助,memminger

4

1 回答 1

0

我假设 SVN 为预提交挂钩创建了一个临时目录是错误的。相反,预提交挂钩可以使用 svnlook 和事务号访问源文件。SVNChecker 将这些文件保存在临时目录中。

导致错误行分隔符的原因是 Python 的一项功能,它自动转换换行符,以便所有 Python 应用程序都可以在内部使用 Unix 行分隔符。但是,默认情况下,只有一些函数将外部源的换行符转换为 Python 内部的换行符。SVNChecker 不处理此问题,这已在http://svnchecker.tigris.org/issues/show_bug.cgi?id=33上报告为错误。

于 2010-03-31T13:38:14.180 回答