git提交文件后CRLF和LF的换行处理问题

问题发现

代码提交 gitlab 后拉取下来 rsync 同步到测试服时发现文件有差异

原因探究

  1. 怀疑提交 git 后文件状态改变,修改 rsync 同步参数改为计算 MD5 值进行比对
  2. 修改参数后仍然有差异,拉取文件进行 MD5 值计算,发现确实 MD5 值不一致
  3. 拉取文件进行差异对比,发现文件内容完全一样,怀疑文件有格式问题
  4. 将两个环境的文件同时在 notepadd++ 打开,发现格不一致 windows(CRLF) 与 unix(LF)
  5. 经检查原始文件格式为 windows(CRLF),提交到 git 后变为 unix(LF)

问题根源

CRLF 和 LF 是文本换行的不同方式:
CRLF 是 carriagereturnline feed 的缩写,中文意思是回车换行,"\r\n", windows 系统的换行方式
LF 是 line feed 的缩写,中文意思是换行,"\n", 是 Linux 系统的换行方式

git会通过CRLF和LF的配置来对源文件文本进行格式处理
在使用 git 提交代码的时候,git 会自动将代码文件当中 CRLF 转换为 LF,再进行同步即有差异

解决办法

修改 git 全局配置文件,core.autocrlf true 改为 false

1
2
3
4
5
6
7

git config --global core.autocrlf true

core.autocrlf 是 git 中负责处理 line endings 的变量

设置为 true,添加文件到 git 仓库时,将把 crlf 变成 lf
设置为 false 时,line-endings 将不做转换操作。文本文件保持原来的换行方式