Eclipse和Windows换行符问题

193

当我的桌面电脑坏掉时,我不得不将Eclipse工作区从Linux移动到Windows。一周后,我把它复制回Linux,开心地编码,提交到CVS。但是遗憾的是,Windows换行符污染了许多文件,所以即使我只更改了一两行代码,CVS diff也会将整个文件都进行比较。

我可以编写一个脚本,但我担心它会破坏我的Eclipse项目文件。


1
通过仅需点击几下即可将项目中少数/全部文件的行结尾转换:https://dev59.com/P2445IYBdhLWcg3wLXIK#7019737 - Teddy
6个回答

373

此处此处所述:

将文件编码设为UTF-8,并将新文件的行尾设置为Unix格式,以便文本文件保存在不特定于Windows操作系统的格式中,并且可以轻松共享到各种不同的开发者桌面上:

  • 导航到工作区首选项(General:Workspace)
  • 更改文本文件编码为UTF-8
  • 更改新文本文件行分隔符为“Other”,然后从列表中选择Unix

alt text

  • 注意:要转换现有文件的行尾,请在Eclipse中打开该文件,然后选择File : Convert Line Delimiters to : Unix

提示: 您可以通过在包资源管理器中选择现有文件,然后转到菜单条目File : Convert Line Delimiters to : Unix来轻松转换现有文件


2
这正是我正在寻找的!我已经为新文件更改了它,但转换选项-我没有注意到。谢谢VonC! - Vasu
@Vasu:不客气 :)。大纲视图和包资源管理器中包含一些针对多个元素的功能,这些功能经常被忽视。 - VonC
非常棒的文章。在Eclipse那个可怕的迷宫般的首选项对话框中搜索这个功能让我快疯了。 - Cerin
41
如果你在包资源管理器中选择整个项目,你可以使用 文件 : 转换行分隔符为 : Unix 命令来一次性“修复”该项目中所有文件的换行符。 - Tal Weiss

13

我曾经遇到过同样的问题,即使只改了一行代码,Eclipse 也会污染文件。 解决方法:Eclipse git 设置 -> 添加条目: 键:core.autocrlf 值:true

enter image description here

enter image description here


虽然这对大多数情况来说是可以的解决方案,但它可能会让你措手不及——例如,在计算源文件的校验和时。这些校验和将因平台而异。 - zb226

8

有一个方便的bash工具 - dos2unix - 它是一个DOS/MAC到UNIX文本文件格式转换器,如果你的发行版上没有安装它,可以通过软件包管理器轻松安装。 dos2unix手册页面


我打算编写一个脚本来递归地在我的Eclipse工作空间中执行此操作。唯一的担心是损坏任何Eclipse内部项目文件。感谢您的建议! - Vasu

7

除了Eclipse的解决方案和另一个答案提到的工具外,还可以考虑flip。它可以在普通模式和Windows换行符之间任意切换,并且会保留文件的时间戳和其他统计信息等附加功能。

您可以像这样使用它来解决问题:

find . -type f -not -path './.git/*' -exec flip -u {} \;

如果你使用git,我已经添加了一个忽略.git目录的条款,但是由于flip默认会忽略二进制文件,所以你可能不需要这个。


只是一点提醒...这个命令是给Linux用户使用的,不是Windows用户。Windows的find命令不是这样工作的。 - Brad
@Brad是正确的。然而,flip也有一个Cygwin版本:https://github.com/jaalto/cygwin-package--flip/ - Michael Scheper

3
你可以尝试一下。问题在于当Windows输入新行时,会插入回车和换行符。而Unix系统只插入换行符。因此,多余的回车字符可能是你的Eclipse混乱新行的原因。
从你的项目中选择一个或两个文件并进行转换。你可以使用Notepad++来完成。只需打开文件,转到格式->转换为Unix(当你使用Windows时)。
在Linux上,只需在命令行上尝试以下操作:
sed 's/$'"/`echo \\\r`/" yourfile.java > output.java

我大约有10k个文件!所以必须要想办法自动化。感谢您的建议! - Vasu
你的CLI上有一些打字错误:sed -i 's/$`echo \\\r`//' yourfile.java,可以使用以下命令自动化处理:find . -name "*.java" -exec sed -i 's/$`echo \\\r`//' {} \; - pdem

3

要在所有子目录中递归地删除CVS/*文件中的回车符(\r),请在unix shell中运行以下命令:

find ./ -wholename "\*CVS/[RE]\*" -exec dos2unix -q -o {} \;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接