背景概述
通常,我们使用git做源码版本控制,在windows平台开发源码并进行单元测试,然后打包部署到linux平台进行集成测试或系统测试。
除源码之外,我们会为部署写一些自动化的脚本,方便服务的启动和关闭。由于脚本文件是直接打包并上传到linux平台的,而windows平台和linux平台的换行符不同,这就导致了脚本在linux平台上执行错误。
相关操作如上图所示,在默认的情况下,git远程仓库(Linux)的代码换行符是LF(linux平台换行符),通过git clone或git pull将代码拉到本地(windows平台),git会自动将换行符替换成CRLF。本地代码通过git push推送到远程仓库,git又会自动替换成linux换行符。
另外,IDEA新建文件,默认也是使用平台的换行符,即windows平台使用CRLF。
在测试阶段,需要频繁的更新文件,脚本也不便单独部署,手动解决换行符的问题(IDEA上可以做)比较低效。
本文就这个问题给出解决方案。
方案一:别给我改
问题出现的原因,是因为git和IDEA考虑了平台换行符的兼容性,其实以LF换行的文件,在windows也可以良好的识别。所以我们可以修改git和idea的行为,不让它更改换行符。
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:匹配文件名
这个方案直接面对问题进行处理,不和平台之间换行符转换的问题进行纠缠,也不必要求同事进行各种设置。只一条:通过打包脚本来打包。
而一般情况下,我们都乐于使用打包脚本来自动打包,所以这一条也没有给开发人员添加任何负担。
总结
我更推荐使用第二种方案,它显得轻量小巧,不和其他问题纠缠夹杂,干净利索。
网友评论