我们编写了一个补丁,用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
作为更好的做法,我建议将此sed
替换为dos2unix
dos2unix source_file > target_file
这消除了^M
字符,但作为副作用它还替换了source_file中可用的一些不应转换的有意义的数据。
所以我们想要一种通过shell脚本从数据文件中删除^ M字符的方法,该脚本不应该提及^ M字符,以便可以通过subversion移植Windows和Linux机器?
摆脱此类问题的最佳做法是什么?
答案 0 :(得分:6)
您所看到的是有人在Windows中编辑文件 - 可能使用记事本 - 并将文件提交到Subversion存储库。这增加了生成文件和shell脚本的行结尾。
幸运的是,一个好的程序编辑器(即不是记事本)可以理解各种文件的行结尾是不同的,并且可以保留甚至转换行结尾。这意味着在Windows机器上编写Unix shell scrips或Makefiles的人理论上可以消除你所看到的^M
。我敦促开发人员使用像Eclipse这样的IDE来处理这个问题,或者至少使用像VIM或Notepad ++这样的程序编辑器,但是很多人仍然喜欢使用记事本并搞砸了所有内容。
您需要做的是为开发人员提供正确的激励以使用正确的编程环境并停止搞乱文件。
以下是一些建议。
您可以使用高压线连接所有开发人员的椅子,每当他们使用记事本编辑文件时立即给他们1000伏的冲击。
您可以使用Subversion的内置机制来处理这些文件的行结尾。
虽然第一种方法非常诱人,但我强烈推荐后一种方法。 Subversion有一个名为svn:eol-style
的属性,它可以强制自动创建以文件结尾的正确行。例如,如果我将snv:eol-style
设置为LF
,则在提交或签出文件时,该文件将始终具有正确的换行行结尾。这样,您无需进行任何后处理即可删除这些行结尾。问题解决了。
唯一的问题是执法问题。当开发人员创建新文件或编辑旧文件时,他们还需要将属性svn:eol-style
设置为正确的值。 Subversion中有一个auto-prop机制可以做到这一点,但你无法确保开发人员使用它。
我使用pre-commit hook,如果没有附加此属性,则可以拒绝提交文件。您应该能够设置此钩子脚本,以便只有那些需要此类行结束的文件(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
这将确保开发人员首先检查具有正确行结尾的文件,因此您不必在其上运行后处理脚本。这可以大大简化您的部署过程,并消除导致错误的最大原因之一。
答案 1 :(得分:2)
sed 's/\r$//'
怎么样?使用\r
序列来表示回车,并且仅在换行符之前删除它们。