1

首先,让我解释一下我在做什么。我有一个 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。

4

1 回答 1

2

Eclipse 比较对话框没有错误;您只是感到困惑,因为您看到了几个独立问题的输出。

  1. “忽略空格”选项只会减少比较对话框显示的更改量;它对CVS 看到的差异没有任何影响。所以只要文件有错误的行尾,CVS 就会报错。

    一些版本控制系统允许你指定转换器来解决这个问题,CVS 不允许。因此,您确实需要生成具有正确行尾的文件。

  2. “带有额外 CRLF 的单个文件”确实有一个额外的 CRLF。找出原因并解决它以使差异消失。

  3. 生成文件时,永远不要使用PrintStreamor PrintWriter。这很诱人,但是这两个有很多错误(比如close()doesn't flush(),违反了他们的 API 合同),而且他们使用平台相关的行尾,这几乎不是你想要的。是的,它可能会偶然起作用,但相信我,这不是你想要的。你也不希望你支付意外提交的支票,对吧?

    如果你不使用PrintStreamnor ,那么出于同样的原因PrintWriter避免使用 System 属性。line.separator

    我建议编写一个辅助类,它有许多PrintStream/的方法,PrintWriter但没有任何错误。另外,它应该允许您将行分隔符设置为您需要的任何内容。

注意:如果您使用 a Writer,请确保您还指定了字符集/编码,否则“UTF-8 到字节”的转换将与行尾一样随机。

于 2012-10-16T15:40:49.857 回答