跨平台代码换行符的问题处理

背景概述

通常,我们使用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:匹配文件名

这个方案直接面对问题进行处理,不和平台之间换行符转换的问题进行纠缠,也不必要求同事进行各种设置。只一条:通过打包脚本来打包。

而一般情况下,我们都乐于使用打包脚本来自动打包,所以这一条也没有给开发人员添加任何负担。

总结

我更推荐使用第二种方案,它显得轻量小巧,不和其他问题纠缠夹杂,干净利索。

posted on 2019-04-01 20:22  一尾金鱼  阅读(1494)  评论(0编辑  收藏  举报