当前位置: 首页 > news >正文

git 乱改你的换行符?一句话设置让 git 不再碰你某个文件的换行符

前些天有位小伙伴告诉我说 git 改了某个重要文件的换行符,导致文件的哈希变了,于是文件校验出现错误。之前一直没问题而最近才有问题是因为最近换了部署服务器,git 的换行符配置不一样。

其实,我们不应该让代码仓库如此容易受到外界环境的影响。所以本文会解释 git 的全局配置如何影响了 git 对换行符的处理,然后说说如何彻底解决这个问题。


本文内容

    • 关于换行符
    • 问题
    • 解决
    • 原因

关于换行符

  • \r = CR = Carriage-Return = 回车
  • \n = LF = Line-Feed = 换行
  • \r\n = CRLF = Carriage-Return Line-Feed = 回车换行

Windows 下默认的文本换行符是 \r\n,Linux 下默认的换行符是 \n,Mac 下默认的换行符是 \r。因为这些差异,如果某部分文本文件会跨操作系统处理,那么换行符的处理就必须考虑了。git 允许开发者设置如何处理换行符在跨平台上的处理方式,不过不合适的设置可能带来文件发生不期望的修改。

问题

问题本身在本文一开始已经说得比较清楚了,现在疏理一下:

  1. 有个文本文件,被 git 改了换行符,导致哈希变化,文件校验出现了错误;
  2. 部署服务器以前 git 全局配置和现在不同,所以以前没问题,现在出了问题。

解决

当时,林德熙 小伙伴是负责部署服务器配置的,看到出事了立刻想到去服务器把配置改“正确”。

然而我阻止了。因为现在因为换服务器出问题,将来也会因为换服务器出问题,更普遍的,换任何环境都可能出问题。所以这问题应该从仓库着手,避免此文件被修改换行符。

于是我和小伙伴结对打开了 .gitattribute 文件,在末尾加了一行:

    *.bmp       binary
    *.jpg       binary
++  *.inf       binary

这样,*.inf 文件会被 git 视为二进制文件,也就不会处理换行符了。

当然,因为项目很小,所以直接改了位于项目根目录的 .gitattribute 文件。如果项目比较大,那么建议考虑在那个 .inf 文件所在的文件夹新建一个 .gitignore 文件,避免全局的设置对可能不需要生效的文件也起了作用。

原因

git 有个全局配置,在 %USERPROFILE%\.gitconfig 文件里面,可以指定如何处理文本文件的换行符:

[core]
	autocrlf = true

有三个可选值:

  • true
  • false
  • input

在 Windows 系统上:

  • true 表示在推送时转成 \n,在拉取时转成 \r\n。这样的设置让 Windows 的开发者能兼容很多的开发工具(比如早期的记事本,新的已经支持 \r\n 了),不至于遇到很多换行符问题。
  • false 表示在推送时和拉取时都原样保留换行符。这样的设置在所有程序员都在同一个平台开发时很有用,git 完全不处理换行符,全部改由开发者自行解决。
  • input 表示在推送时转成 \n,在拉取时原样保留换行符。注意到,这样的设置会让仓库里所有的换行符都变成 \n 不再有什么时候有 \r\n 了,所以对 Windows 平台的开发者并不友好。

以前的服务器全局配置没有问题,是因为服务器配置为 true,于是拉下来时一定都是 \r\n 哈希正确。而现在全局配置是 false,于是会原样把 git 仓库里的拉下来,哈希错误。

是的,你没看错!远程 git 仓库里的是错的!这是因为有小伙伴使用了 true 或者 input 的配置,导致推送时统一把换行符改成了 \r\n


我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • Linux Shell 中需要转义的字符
  • Unity3D 入门:Unity Editor 编辑器常用快捷键
  • Unity3D 入门:Unity 项目版本管理建议使用的 .gitignore 忽略文件和 .gitattributes 文件(2020年4月更新)
  • Unity3D 入门:让 C# 脚本公开可在 Unity 编辑器中设置的属性
  • Unity3D 入门:如何管理 Unity 项目中的 NuGet 包?使用第三方 NuGet 包管理器——NuGetForUnity
  • Unity3D 入门:如何在脚本中找到游戏对象的父子级 祖孙级对象和它们的组件
  • Unity3D 入门:如何制作天空效果?天空盒的使用
  • Unity3D 入门:使用 Visual Studio 开发 Unity C# 脚本,说说根目录的那些 sln 和 csproj 文件
  • Unity3D 入门:最简单的控制视角,以及控制角色前进、转向的脚本
  • 比较 Windows 上四种不同的文件(夹)链接方式(NTFS 的硬链接、目录联接、符号链接,和大家熟知的快捷方式)
  • 了解 Windows Linux 下命令行 Shell 启动程序传参的区别,这下不用再担心 Windows 下启动程序传参到 Linux 下挂掉了
  • 适合 .NET 开发者用的 GitHub Actions(时不时更新)
  • 在 CMD 里根据进程名杀掉进程
  • 在 PowerShell 里根据进程名杀掉进程
  • 在制作多框架项目的 NuGet 包时应该注意的问题(buildMultiTargeting TargetFrameworks)
  • 2017前端实习生面试总结
  • Angularjs之国际化
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Django 博客开发教程 16 - 统计文章阅读量
  • HomeBrew常规使用教程
  • Joomla 2.x, 3.x useful code cheatsheet
  • Python_网络编程
  • Python打包系统简单入门
  • Python爬虫--- 1.3 BS4库的解析器
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Vim Clutch | 面向脚踏板编程……
  • vue-cli在webpack的配置文件探究
  • 翻译--Thinking in React
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 马上搞懂 GeoJSON
  • 排序算法之--选择排序
  • 全栈开发——Linux
  • 项目管理碎碎念系列之一:干系人管理
  • 阿里云重庆大学大数据训练营落地分享
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • #QT(串口助手-界面)
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (4)logging(日志模块)
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (翻译)terry crowley: 写给程序员
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)Oracle存储过程编写经验和优化措施
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • (轉貼) UML中文FAQ (OO) (UML)
  • .bat批处理出现中文乱码的情况
  • .net core控制台应用程序初识
  • .net 简单实现MD5
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .net专家(张羿专栏)
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [Android]一个简单使用Handler做Timer的例子