Git中的AutoCRLF与SafeCRLF换行符问题

背景介绍

        最近在做CICD的时候遇到了一个问题,简单来说就是,git根目录下有个文件,编译代码后大小是25Kb,提交后重新clone最新代码文件变成26kb且用这个文件打包发布有问题。

考虑到可能不是文本级的差异,使用了Beyond Compare进行十六进制比较。

确实还是有差异的,左侧部分多出很多0D,十六进制中0D代表回车、换行符。于是百度 “git 换行符” 找到解释与方案如下:

在各操作系统下,文本文件所使用的换行符是不一样的。UNIX/Linux 使用的是 0x0A(LF),早期的 Mac OS 使用的是0x0D(CR),后来的 OS X 在更换内核后与 UNIX 保持一致了。但 DOS/Windows 一直使用 0x0D0A(CRLF)作为换行符。Git提供了一个“换行符自动转换”功能。这个功能默认处于“自动模式”,当你在签出文件时,它试图将 UNIX 换行符(LF)替换为 Windows 的换行符(CRLF);当你在提交文件时,它又试图将 CRLF 替换为 LF。Git 的“换行符自动转换”功能听起来似乎很智能、很贴心,因为它试图一方面保持仓库内文件的一致性(UNIX 风格),一方面又保证本地文件的兼容性(Windows 风格)。

使用cmd命令关闭自动模式

git config --global core.autocrlf false
git config --global core.safecrlf true

参考内容:http://www.cnblogs.com/sdgf/p/6237847.html

         http://www.cnblogs.com/flying_bat/p/3324769.html

         http://blog.csdn.net/igorzhang/article/details/17420949

重新clone最新代码,文件大小变为25kb与编译后一致,问题解决。然鹅事情并没有这么简单为虚拟机做同样设置手重新测试jenkins时发现,workspace下的最新代码依然是26kb;测试用git clone最新代码发现是25kb说明命令是生效的,但是好像没有影响到jenkins

经过漫长的搜索,找到如下帖子

链接: https://issues.jenkins-ci.org/browse/JENKINS-21088

前辈的经验告诉我们,看来单单通过配置git参数,不能完全解决这个问题,于是尝试创建了.gitattributes 文件,注意需创建到项目在git的根目录中。创建完成后Commit and push

 .gitattributes 文件内容如下:

# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto

# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text
*.profile -text

# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf

重新测试jenkins发现workspace下的文件已变为25kb,问题解决。

END

原文地址:https://www.cnblogs.com/JooJoBlogs/p/10456342.html