您所看到的是有人在 Windows 中编辑文件(可能使用记事本)并将文件提交到您的 Subversion 存储库。这增加了破坏 Makefile 和 shell 脚本的行尾。
幸运的是,一个好的程序编辑器(即不是记事本)可以理解各种文件的行尾是不同的,并且可以保留甚至转换行尾。这意味着在 Windows 机器上编写 Unix shell 脚本或 Makefile 的人理论上可以消除^M
您所看到的。我敦促开发人员使用像 Eclipse 这样的 IDE 来处理这个问题,或者至少使用像 VIM 或 Notepad++ 这样的程序编辑器,但许多人仍然喜欢使用记事本并搞砸一切。
您需要做的是给予开发人员适当的激励,让他们使用正确的编程环境并停止弄乱文件。
这里有几个建议。
您可以将高压线连接到所有开发人员的椅子上,并在他们使用记事本编辑文件时立即给他们 1,000 伏特的电击。
您可以使用 Subversion 的内置机制来处理这些文件的行尾。
虽然第一种方法很诱人,但我强烈推荐后一种方法。Subversion 有一个名为的属性svn:eol-style
,可以强制自动创建以文件结尾的正确行。例如,如果我设置snv:eol-style
为LF
,则文件在提交或签出时将始终具有正确的换行换行符结尾。这样,您不必进行任何后处理来删除这些行尾。问题解决了。
唯一的问题是执法问题。当开发人员创建新文件或编辑旧文件时,他们还需要将属性设置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
这将确保开发人员首先签入具有正确行尾的文件,因此您不必对它们运行后处理脚本。这可以大大简化您的部署过程并消除最大的错误原因之一。