不一致的行尾风格噩梦

18

我在一次提交2447个文件时遇到了一个SVN错误,完全卡住了。我使用的是Windows 7 64位系统上的TortoiseSVN(最新版本)。

事实上,一些文件是在Mac上创建的,而另一些是在PC上创建的,因此TortoiseSVN停止了提交,并显示了一个烦人的不一致的行结束样式错误。

起初,为了解决这个问题,我手动打开了NetBeans中涉及到的文件,添加了一个空格,然后将其删除并保存该文件,以便NetBeans正确地转换所有行结束字符,但似乎有更多的“一些文件”被牵连其中。


2
我建议在Cygwin shell上尝试使用unix2dos命令。 - Kai
1
编写一个小程序,查找Mac风格的终止符并将其替换为Windows风格的终止符。Netbeans使用正则表达式的查找和替换功能也可以实现此操作。 - assylias
Notepad++ 还可以一次性在多个文件中查找和替换,并支持搜索 \r\n 等。 - Kai
我更喜欢 @assylias 的解决方案。我创建了一个几乎可以工作的正则表达式:\w\n$ - 它选择所有 Unix 的行结尾字符,除了选择在开头的第一个字符(\w)。 - Epoc
2
你可以捕获w: (\w)\n$ 并用 $1\r\n 替换,其中 $1 是字符。 - assylias
谢谢,它(在我进行一些修改后)起作用了! - Epoc
8个回答

26
在Windows 7下,您可以使用Notepad ++ v5.6.8来转换EOL字符:
菜单编辑EOL转换Windows / Unix / Mac

1
谢谢你!在使用GIT一段时间后,我完全忘记了这个! - Sampgun

3
Notepad++ 中,选择菜单 视图显示符号显示行尾
在搜索框 (Ctrl + F) 中,选择正则表达式搜索模式,然后搜索以下字符串:

[^\r]\n$

(翻译:一个没有 \r 直接跟着的 \n)
这将直接带你到有问题的行,你会看到该行使用 LF 而不是 CR-LF 来结束。

你确定字符组后面的点是正确的吗?据我所知,这个正则表达式选择包含“除了\r之外的任何内容”后跟“任何内容”再后跟\n的行。难道表达式不应该是[^\r]\n$吗? - Fabian Streitel
谢谢,那里本不应该有。这个表单为我找到了以 \n 结尾而不是 \r\n 的行。已修复。 - Dror Harari
我的 NP++ 匹配的是 $\r\n 而不是 \r\n$(将行尾作为行分隔符之前的字符计算),以防有人遇到问题。 - Hashbrown

3
您可以使用正则表达式 (\w)\n$ 捕获 w, 并将其替换为 $1\r\n,其中 $1 是字符。
在 NetBeans 中使用此正则表达式进行搜索和替换即可完成操作。
我的问题是一个自定义脚本在这些文件中插入了错误的 EOL 字符(\n 而不是 \r\n)。
(我在@assylias's comment 中回答了自己的问题。)

如果这是对你最好的解决方案,为什么你没有将其标记为答案呢? - Simon Sobisch
@SimonSobisch:可能是因为stackoverflow不允许你在48小时内接受自己的答案,而且一旦可以接受,大多数人都不愿意记得回去接受它,这并不值得他们的时间。 - ToolmakerSteve
@ToolmakerSteve 在这种情况下不太可能发生,因为 Epoc 接受了一个在他自己回答两周后发布的答案。我只是问了一下,因为他在他的回答中明确写道“这对我有用”,但却将得票最多的答案标记为“这对我有用”。 - Simon Sobisch
最受赞同的回答比我的简单得多。 - Epoc

2
如果您的行尾都是按顺序排列的,那么可能是您的文本文件有一个 UTF-16 字节顺序标记(BOM)。
您可以使用 Notepad++ 来修复。菜单 编码转换为 UTF-8

不错的发现!由于某种原因,Windows计划程序将其任务导出为UCS2 LE BOM编码的XML文件:| 显然,Tortoise不太喜欢这样。在转换为UTF后,计划程序仍然能够成功地将它们导入回来,所以对我来说这很有效。 - Hashbrown

1

我通过右键单击文件资源管理器来打开项目属性窗口,浏览我想要编辑的仓库,然后选择:

TortoiseSVN属性新建...EOL保留原样(没有特定的EOL)确定


0
在 Windows 下的 VimgVim 中,所有的破损文件都会在每行末尾显示 ^M
要修复它:使用 :s/\r//g 命令来移除多余的行末标记。

0
为了解决不同行尾的问题,您可以按照以下方式设置Subversion(SVN)属性:
svn propset svn:eol-style native my_file

虽然这样做可以解决行尾问题并使合并更容易,但这意味着blame将显示添加EOL样式的人作为所有行的更改者,并且这也意味着在进行差异比较时,您的工作文件将被复制到临时文件夹中。

之后可以通过以下方式解决责任问题:

svn blame my_file -x "--ignore-space-change --ignore-eol-style"

0
关于Fabian Streitel的帖子,实际上Vim正则表达式应该是:1,$s/\r//g以覆盖整个文件。
在类Unix系统上的另一种方法是使用sed
sed -i '-es/\r//g' <your_file>

1
请勿将答案称为“刚才上面的”。它们按分数排序,因此“刚才上面的”可能会更改。此外,如果只是更正,请将其作为对该答案的评论,而不是单独的答案。您应该澄清您的答案,并使其成为独立的答案或删除它。 - Keith M

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