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

背景概述

一般,咱们使用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的设置

这些设置并不能改变已有文件的换行符,最直接的方式是把本地仓库删除掉,从新从远程仓库拉代码。idea

可是这个方案存在着必定的难度和隐患。说难,是由于须要在团队内部进行宣贯,确保每一个人都按照这样作了;说隐患,是新员工未必能及时遵照这个规定,或者在从新安装软件的时候,又恢复到了默认的设置。

不过,这并不算什么大事情,只是有点麻烦。

方案二:让脚本改

之因此要修改换行符,是由于咱们要部署到linux平台上去用,那么可让打包脚本统一修改文件的换行符。

借助于dos2unix工具,脚本能够直接调用命令,将要修改的文件路径做为参数。要递归修改某个目录,也能够经过shell脚原本实现。

首先,从连接下载工具,放置到合适的目录。

经过相似于下面的命令,实现递归修改文件:

find D:/projects/release_dir -type f ! -name "*.jar" | xargs dos2unix.exe

# find:搜索文件系统
# -type f:限定文件
# !:逻辑非
# -name:匹配文件名

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

而通常状况下,咱们都乐于使用打包脚原本自动打包,因此这一条也没有给开发人员添加任何负担。

总结

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

相关文章
相关标签/搜索