我们编写了一个补丁,用shell脚本替换数据文件中提供的^ M字符;
sed 's/^M//g' source_file > target_file
Run Code Online (Sandbox Code Playgroud)
但是因为我们使用subversionshell脚本的源代码控制而且我已经指定了eol-style:native属性; ^M当我们接受svn updateUNIX盒子并且变成时,这被新线替换
sed 's/
//g' source_file > target_file
Run Code Online (Sandbox Code Playgroud)
作为一个更好的做法我建议更换该sed有dos2unix
dos2unix source_file > target_file
Run Code Online (Sandbox Code Playgroud)
这摆脱了^M角色,但作为副作用,它还取代了一些不应转换的source_file中可用的有意义的数据.
所以我们想要一种通过shell脚本从数据文件中删除^ M字符的方法,该脚本不应该提及^ M字符,以便它可以通过subversion移植到Windows和Linux机器上?
摆脱这些问题的最佳做法是什么?
你所看到的是有人在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机制可以做到这一点,但是你无法确保开发人员使用它.
我使用预提交挂钩,如果它们没有附加此属性,则可以拒绝允许提交文件.您应该能够设置此钩子脚本,以便只有那些需要此类行结束的文件(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
Run Code Online (Sandbox Code Playgroud)
这将确保开发人员首先检查具有正确行结尾的文件,因此您不必在其上运行后处理脚本.这可以大大简化您的部署过程,并消除导致错误的最大原因之一.
| 归档时间: |
|
| 查看次数: |
2518 次 |
| 最近记录: |