首先,让我解释一下我在做什么。我有一个CVS存储库,我存储了5,000个数据定义语言文件。这5,000个文件是从外部数据建模应用程序生成的,它们是文本并具有Windows CRLF。在开发过程中,如果我需要进行更改,我会重新生成5,000个文件,然后在eclipse中覆盖我本地CVS工作区的内容。完全覆盖/替换是为了确保我不会错过任何文件更新。在覆盖/替换文件后,我使用eclipse做一个团队<与存储库同步。当我这样做时,比较将每个文件标记为传出更改,因为它看起来不会忽略其比较中的CRLF。我已经检查了“忽略空格”并且eclipse文档声明它应该忽略CRLF:
Ignore whitespace option:
Causes the comparison to ignore differences which are whitespace characters
(spaces, tabs, etc.). Also causes differences in line terminators ( LF
versus CRLF) to be ignored.
当我在文本比较中打开文件时,它没有显示差异,但在其中一个文件的顶部有一个额外的CRLF。这是一个错误还是我在eclipse中缺少一个选项?看起来问题是它不会忽略各自的CRLF。
答案 0 :(得分:2)
Eclipse比较对话框没有错误;你只是感到困惑,因为你看到了几个独立问题的输出。
“忽略空格”选项只会减少比较对话框显示的更改量;它对CVS看到的差异没有任何影响。因此,只要文件的行结尾错误,CVS就会抱怨。
某些版本控制系统允许您指定转换器来解决此问题,而CVS则不允许。所以你真的需要生成具有正确行结尾的文件。
“带有额外CRLF的单个文件”确实有一个额外的CRLF。找出原因并解决问题,以消除差异。
生成文件时,绝不能使用PrintStream
或PrintWriter
。这很诱人但是这两个有很多错误(比如close()
没有flush()
,违反了他们的API合约)加上他们使用平台相关的行结尾,这几乎不是你想要的。是的,这可能是偶然的,但相信我,这不是你想要的。你也不希望你在事故中支付支票,对吗?
如果您不使用PrintStream
或PrintWriter
,请出于同样的原因避免使用系统属性line.separator
。
我建议编写一个帮助器类,其中包含PrintStream
/ PrintWriter
的许多方法,但没有任何错误。此外,它应该允许您将行分隔符设置为您需要的任何内容。
注意:如果您使用Writer
,请确保您还指定了charset / encoding或“UTF-8 to bytes”转换将与行结尾一样随机。