一般,咱们使用git作源码版本控制,在windows平台开发源码并进行单元测试,而后打包部署到linux平台进行集成测试或系统测试。linux
除源码以外,咱们会为部署写一些自动化的脚本,方便服务的启动和关闭。因为脚本文件是直接打包并上传到linux平台的,而windows平台和linux平台的换行符不一样,这就致使了脚本在linux平台上执行错误。git
如上图所示,在默认的状况下,git远程仓库(Linux)的代码换行符是LF(linux平台换行符),经过git clone或git pull将代码拉到本地(windows平台),git会自动将换行符替换成CRLF。本地代码经过git push推送到远程仓库,git又会自动替换成linux换行符。
另外,IDEA新建文件,默认也是使用平台的换行符,即windows平台使用CRLF。shell
在测试阶段,须要频繁的更新文件,脚本也不便单独部署,手动解决换行符的问题(IDEA上能够作)比较低效。windows
本文就这个问题给出解决方案。bash
问题出现的缘由,是由于git和IDEA考虑了平台换行符的兼容性,其实以LF换行的文件,在windows也能够良好的识别。因此咱们能够修改git和idea的行为,不让它更改换行符。ide
git有两个配置项,与换行符相关:工具
core.autocrlf - true 提交时转换为LF,检出时转换为CRLF(默认行为)。 - false 提交检出均不转换。 - input 提交时转换为LF,检出时不转换 core.safecrlf - true 拒绝提交包含混合换行符的文件 - false 容许提交包含混合换行符的文件 - warn 提交包含混合换行符的文件时,给出警告
由于咱们只是想确保本地的代码也使用LF换行符,并不打算改变远程仓库的换行符,因此建议设置以下:单元测试
core.autocrlf=input core.safecrlf=true
IDEA上也能够设置,新建的文件使用的换行符:测试
这些设置并不能改变已有文件的换行符,最直接的方式是把本地仓库删除掉,从新从远程仓库拉代码。idea
可是这个方案存在着必定的难度和隐患。说难,是由于须要在团队内部进行宣贯,确保每一个人都按照这样作了;说隐患,是新员工未必能及时遵照这个规定,或者在从新安装软件的时候,又恢复到了默认的设置。
不过,这并不算什么大事情,只是有点麻烦。
之因此要修改换行符,是由于咱们要部署到linux平台上去用,那么可让打包脚本统一修改文件的换行符。
借助于dos2unix工具,脚本能够直接调用命令,将要修改的文件路径做为参数。要递归修改某个目录,也能够经过shell脚原本实现。
首先,从连接下载工具,放置到合适的目录。
经过相似于下面的命令,实现递归修改文件:
find D:/projects/release_dir -type f ! -name "*.jar" | xargs dos2unix.exe # find:搜索文件系统 # -type f:限定文件 # !:逻辑非 # -name:匹配文件名
这个方案直接面对问题进行处理,不和平台之间换行符转换的问题进行纠缠,也没必要要求同事进行各类设置。只一条:经过打包脚原本打包。
而通常状况下,咱们都乐于使用打包脚原本自动打包,因此这一条也没有给开发人员添加任何负担。
总结
我更推荐使用第二种方案,它显得轻量小巧,不和其余问题纠缠夹杂,干净利索。