我的基于Perforce的项目支持具有相同shell脚本的Linux和Cygwin平台(例如build_project.sh
)。但Perforce将文本文件的行结尾默认为本地平台(Docs)。这会导致\r\n
脚本中的.sh
个换行符,这些换行符在Cygwin上失败。
到目前为止我想到的一些想法:
有没有办法让Cygwin接受\ r \ n文件?(无需运行dos2unix
,文件以只读方式获取。)
有没有办法将特定文件设置为文本,但每个人都使用Unix行结尾?(我猜,"没有",但我想&我#39; d检查。)
当然,我可以将整个工作区的行结尾设置为\n
(unix)。但这使得Windows客户对其.bat
文件\n
而不是\r\n
感到不满。此外,如果设置是每个工作区(我无法回忆),那么新Windows用户的工作区设置会稍微困难,因为他们必须设置该选项。
将.sh
文件设置为"二进制",然后我们丢失这些文件上的文本差异。 有解决方法吗?这是常见的(好)黑客吗?
这是一个相当小的例子,但我怀疑你们中的一些人有这种模式的BKM。
感谢。
编辑:Craig在this question中的答案似乎表明,如果最初以这种方式提交,使用Unix行结尾只会留下\r\n
个单独的文件。< / p>
编辑:要强制bash(即Cygwin)接受\r\n
结尾的文件,可以在脚本中指定set -o igncr
。如果人们期望Cygwin用户可能不是非常懂Unix(我的情况),或者由于某些其他原因我们无法在下面的解决方案中全局强制执行触发器,那就太好了。
答案 0 :(得分:3)
我相信当您安装Cygwin时,您可以将其配置为使用Windows行结尾。但是,不管怎么说:
如果您使用&#34; unix&#34; LineEnd绝对适合所有人,那么所有文本文件都有自己内部一致的行结尾(但不一定与客户端平台一致)。这是因为Windows文件最终将\ r \ n作为行内容的一部分,因此当在&#34; unix&#34;中同步时格式他们将有\ r \ n结尾。
需要注意的是在执行此操作时混合和匹配LineEnd设置 - 如果某人有&#34; win&#34;或者&#34;本地&#34; LineEnd同步相同的文件,现在它们有\ r \ n \ n \ n结尾!因此,如果您想使用每个文件行的结束计划,请确保每个人都使用&#34; unix&#34;作为他们的LineEnd。使用触发器非常容易,例如:
Triggers:
form-in client "sed -i %quote%s/LineEnd:.*/LineEnd: unix/%quote% %formfile%"