Git中CRLF与LF的转换

1.换行符在不同的操作系统上的表示

首先要理解的一点是,对于不同的操作系统,对于换行符的表示是不一样的。也就是说当我们在编辑一个文件,在键盘上按下回车键的时候,对于不同的操作系统保存到文件中的换行符是不一样的。见下表:

CR:表示回车\r
LF:表示换行\n
CRLF:表示回车换行\r\n

敲下回车键,不同的操作系统保存到文件中的值:
Windows:使用的是CRLF ==> 即\r\n,文件中保存的是\r\n
Linux/Unix: 使用的是LF ==> 即\n,文件中保存的是\n
Mac OS: 使用的是CR ==> 即\r,文件中保存的是\r
Mac OS X系统:使用的是LF ==> 即\n,文件中保存的是\n(Mac OS X已经改成和Unix/Linx一样使用LF)

问题: 既然不同的操作系统,对于换行符使用不同的表示形式,如果一个团队在开发一个共同的项目,如果你使用的是windows系统,而你的小伙伴用的是Mac的话,当你们使用git协同开发软件时,就会出现换行符不统一的问题。

虽然对于不同的操作系统,默认的换行符的表示方法不一样,但是编辑器是可以设置在敲下回车键的时候保存的换行符是什么的,比如常用的vscode就可以进行设置。直接点击编辑器右下角的LF或者CRLF,出现如下图所示的设置,直接选择即可。在设置完成之后,在敲回车键,保存在文件中的换行符就是你设置的(CRLF或者是LF,设置什么就是什么)。

2.Git会自动对换行符进行转换

Git为了解决上面提出的问题,会自动对换行符进行转换。转换的方案有3种:

  1. 在提交时将CRLF转换为LF,在拉取(检出checkout)时将UNIX换行符(LF)替换成CRLF。(Windows系统推荐使用,我们在windows上安装git的时候,如果一路next,默认是使用这个方案)
  2. 在提交时将CRLF转换为LF,在拉取(检出checkout)时不进行转换。(Linux/Unix和Mac OS和Mac OS X推荐使用,在Unix或者类Unix操作系统上安装git,默认使用这种方案)
  3. 不进行转换(这种方案对于跨平台项目不推荐使用)。

可以发现,如果不使用第3种方案,那么在Git仓库(包括本地仓库和GitHub远程仓库)中保存的文件的换行符都是LF表示的。

3.自己指定换行符转换方案

我们自己在开发过程中,是可以修改/设置Git的换行符转换方案的。修改/设置的方法有2种。

3.1 通过Git的全局配置进行修改

设置autoclf属性,在控制台直接运行如下的一条命令就可以设置了:

// 提交时转换为LF,检出时转换为CRLF
git config --global core.autocrlf true   

// 提交时转换为LF,检出时不转换
git config --global core.autocrlf input   

// 提交检出均不转换
git config --global core.autocrlf false

上述命令运行之后,会修改.gitconfig文件。

一般在项目中,为了避免项目中同时出现CRLF和LF,还可以开启safecrlf检查。当然,如果你的项目自己定义了语法检查规则,例如使用eslint去约束换行符必须是LF,那么当你的文件中出现CRLF的时候,eslint会给你错误提示信息,告诉你不能包含CRLF,这时候,不开启safecrlf也是可以的 (一般建议开启)

开启方法如下第一条命令:

// 拒绝提交包含混合换行符的文件 (一般设置为true)
git config --global core.safecrlf true   

// 允许提交包含混合换行符的文件
git config --global core.safecrlf false   

// 提交包含混合换行符的文件时给出警告
git config --global core.safecrlf warn

上述命令运行之后,也会修改.gitconfig文件。

3.2 通过.gitattributes进行修改

注意.gitattributes是针对一个单一的仓库的,也就是说每一个代码仓库都可以包含一个.gitattributes文件。这种方式设置之后,不需要一个项目组里面的同事分别再去修改自己电脑的git的全局配置。

对于通过.gitattributes设置换行符的转换方案,可以使用如下的命令:

1. text=auto:采用git认为最好的方式来处理文件,未在.gitattributes中设置的项默认按照这种方式处理;

2. text eol=crlf:对左边匹配的文件统一使用CRLF换行符格式,如果有文件中出现LF将会转换成CRLF;

3. text eol=lf:对左边匹配的文件统一使用LF换行符格式,如果有文件中出现CRLF将会转换成LF;

4. binary: 告诉git该文件为二进制,防止git修改该文件。git不会对对其中的换行符进行改变。

注意:.gitattributes文件必须要提交之后才能生效。

参考博客:

  1. https://segmentfault.com/a/1190000013973362?utm_medium=referral&utm_source=tuicool
  2. https://www.jianshu.com/p/f13ef9e538e0

原文地址:https://www.cnblogs.com/wangwenhui/p/12141758.html

时间: 2024-10-10 18:34:41

Git中CRLF与LF的转换的相关文章

git crlf、lf自动转换引起的问题

??项目组最近加了一个新功能到代码中,使用flyway记录数据库版本变更,,,该工具会记录每次数据库结构的修改并生成sql文件存在指定目录上(当然必须用它来变更数据库,外部的变更它是无法感知的),然后每次启动时flyway会检查使用的数据库和当前项目代码中的sql变更版本是否一致,一致正常启动,不一致中如果是数据库落后将会更新数据库(这样能够保证代码在任何地方运行数据库都是一致的),否则就报错了.数据库中有一张表记录版本信息,如下图: 同时本地代码中也有一个文件夹保存每次操作的sql语句,如下图

[git] warning: LF will be replaced by CRLF | fatal: CRLF would be replaced by LF[ git 处理和修改行结束符(CRLF和LF)]

我自己的设置是: [core] autocrlf = false[core] safecrlf = true 取消自动转换CRLF(上图中选的是commit as is),但是有提交前混用检查 本人用的是WINDOWS下的PHPSTORM开发的PHP 遇到这两个错误,是因为Git的换行符检查功能. core.safecrlf Git提供了一个换行符检查功能(core.safecrlf),可以在提交时检查文件是否混用了不同风格的换行符.这个功能的选项如下: false - 不做任何检查 warn 

CRLF和LF

目录: 什么是CRLF和LF 为什么要探究CRLF和LF 三种方式处理的不同 更多 参考文献 1.什么是CRLF和LF CRLF 是carriagereturnlinefeed的缩写.中文意思是回车换行. LF是line feed的缩写,中文意思是换行. 2.为什么要探究CRLF和LF 在学习git软件,安装git到configuring the lien ending conversion时,有三个选项. a. Checkout Windows-style,commit Unix-style

git 中关于LF 和 CRLF 的问题

git 中关于LF 和 CRLF 的转换问题注意: Windows下编辑器设置中,建议调整设置为Unix风格.(具体设置位置各种编辑器上不同,需要找找) 使用Git Bash进行命令行操作时,运行一下这个命令检查一下输出结果,确认输出为false: $ git config --get core.autocrlf false 如果不是false,请修改为false $ git config --global core.autocrlf false 最好在.gitconfig文件设置好.详情可见:

git中配置autocrlf来正确处理crlf

在使用git的过程中,如果我们的项目是跨平台开发的 那么CRLF的处理也许会成为一个很头疼的事情,有可能会出以下的莫名其妙的问题: 我们的某个开发人员在linux上提交的一个文件, 当从windows上pull下来后,没做任何的修改,查看其status,它的状态已经是modifed了 即使你使用git checkout -f来恢复改文件,它的状态仍然是modified,真是郁闷… 后来,才发现就是CRLF惹的祸. 我们都知道,在Windows上是CRLF来作为一行的结束符,而Linux上则是LF

Git中三种文件状态及其转换

Git作为一种版本控制解决方案,由于其具有的分布式特性,正被越来越多的用户熟知,一些有名的开源项目,如:Linux kernel,CakePHP,Ruby on Rails等,都在使用Git进行版本管理. 在Git中,文件状态是一个非常重要的概念,不同的状态对应不同的操作.因此,要想熟练掌握Git的用法,需要了解Git的几种文件状态. 为了说明的方便,现在初始化一个项目,也就是将项目所在目录纳入Git的管理之下.假设项目目录为hello_world,初始化之后,在目录下新建README.txt文

git 处理 crlf rf

假如你正在 Windows 上写程序,又或者你正在和其他人合作,他们在 Windows 上编程,而你却在其他系统上,在这些情况下,你可能会遇到行尾结束符问题.这是因为 Windows 使用回车和换行两个字符来结束一行,而 Mac 和 Linux 只使用换行一个字符.虽然这是小问题,但它会极大地扰乱跨平台协作. Git 可以在你提交时,自动地把行结束符 CRLF 转换成 LF,而在签出代码时把 LF 转换成 CRLF .用 core.autocrlf 来打开此项功能,如果是在Windows 系统上

Git实战(四)状态转换

上次的Git实战(三)环境搭建博文,我们大致讲解了一下git的环境安装,今天我们讲解一下Git的状态转换. 学习版本控制工具,对工具进行版本控制之间的状态转换非常重要.毕竟Git只是一个工具,如果不了解工具的每一步操作都是为什么,那么学习Git也就没有多大意义了. Git初始化 在学习Git状态转换之前,我们先来认识一下Git的初始化,即在本地创建一个Git版本库.与SVN在服务器上创建唯一的版本库不同,Git版本库可以随客户端需要自由在客户端创建,其个数和位置不受任何限制.git初始化命令,如

Git 中对象模型和文件的详细视图

Git 中存在的三种状态:工作目录.索引和对象库. 目录中存在两个文件,且经过一次提交,所以现在是同步的. 对 file1编辑,更改为quue.状态如下: 接下来执行git add file1将其添加进索引库中. 提交: 虚拟树对象转换成一个真实的树对象后,以SHA1命名,然后放在对象库中. 创建新的提交对象 master分支的引用移动至新创建的对象,成为新的master HEAD