1

我们编写了一个补丁来使用 shell 脚本替换数据文件中提供的 ^M 字符;

sed 's/^M//g' source_file > target_file

但是由于我们subversion用于 shell 脚本的源代码控制并且我已经指定了eol-style:native属性;当我们使用UNIX 框时,这^M被替换为新行并变为svn update

sed 's/
//g' source_file > target_file

作为一种更好的做法,我建议将其替换seddos2unix

dos2unix source_file > target_file

这摆脱了^M字符,但作为副作用,它也替换了 source_file 中一些不应该转换的有意义的数据。

所以我们想要一种方法来通过一个不应提及 ^M 字符的 shell 脚本从数据文件中删除 ^M 字符,以便它可以通过颠覆移植到 Windows 和 Linux 机器上?

摆脱这些问题的最佳做法是什么?

4

2 回答 2

6

您所看到的是有人在 Windows 中编辑文件(可能使用记事本)并将文件提交到您的 Subversion 存储库。这增加了破坏 Makefile 和 shell 脚本的行尾。

幸运的是,一个好的程序编辑器(即不是记事本)可以理解各种文件的行尾是不同的,并且可以保留甚至转换行尾。这意味着在 Windows 机器上编写 Unix shell 脚本或 Makefile 的人理论上可以消除^M您所看到的。我敦促开发人员使用像 Eclipse 这样的 IDE 来处理这个问题,或者至少使用像 VIM 或 Notepad++ 这样的程序编辑器,但许多人仍然喜欢使用记事本并搞砸一切。

您需要做的是给予开发人员适当的激励,让他们使用正确的编程环境并停止弄乱文件。

这里有几个建议。

  1. 您可以将高压线连接到所有开发人员的椅子上,并在他们使用记事本编辑文件时立即给他们 1,000 伏特的电击。

  2. 您可以使用 Subversion 的内置机制来处理这些文件的行尾。

虽然第一种方法很诱人,但我强烈推荐后一种方法。Subversion 有一个名为的属性svn:eol-style,可以强制自动创建以文件结尾的正确行。例如,如果我设置snv:eol-styleLF,则文件在提交或签出时将始终具有正确的换行换行符结尾。这样,您不必进行任何后处理来删除这些行尾。问题解决了。

唯一的问题是执法问题。当开发人员创建新文件或编辑旧文件时,他们还需要将属性设置svn:eol-style为正确的值。Subversion 中有一个自动支持机制可以做到这一点,但你无法确保开发人员使用它。

我使用了一个预提交钩子,如果文件没有附加此属性,它可以拒绝提交文件。您应该能够设置这个钩子脚本,以便只有需要这种类型的行结束的文件(Unix 脚本、Makefile 等)而其他不受影响的文件(Java 源代码、XML 等) .

我的预提交钩子很容易设置和使用。您使用控制文件来设置您需要的内容。例如:

[PROPERTY All Unix Scripts must have "svn:eol-style" set to "LF"]
match = .\(sh|pl|py|ksh|csh)$
property = svn:eol-style
value = LF
type = string

[PROPERTY All Makefiles must have "svn:eol-style" set to "LF"]
match = [Mm]akefile
property svn:eol-style
value = LF
type = string

这将确保开发人员首先签入具有正确行尾的文件,因此您不必对它们运行后处理脚本。这可以大大简化您的部署过程并消除最大的错误原因之一。

于 2012-08-31T13:24:58.947 回答
2

What about sed 's/\r$//' ? use the \r sequence to denote carriage return, and only remove them just before a newline.

于 2012-08-31T08:19:34.467 回答