Git 多平台换行符问题(LF or CRLF)

在不同的操作系统上,使用git提交代码时,可能遇到如下提示:

warning: CRLF will be replaced by LF in index.html.
warning: LF will be replaced by CRLF

背景:本人在 Mac下提交html代码,报出
warning: CRLF will be replaced by LF in index.html.无法提交代码。

CR为回车符,LF为换行符。Windows结束一行用CRLF,Mac和Linux用LF。
文本文件所使用的换行符,在不同的系统平台上是不一样的。


到此时,就在想:为什么提交代码会出现这个问题,之前一直使用git怎么没有出现过;仔细想了一番,出现如此提示的原因可能如下:

  • 在Mac/Linux下提交html代码,报出
    warning: CRLF will be replaced by LF in heart/index.html.

是因为,你提交的代码里面包含CRLF方式的换行,需要转化为Mac/Linux平台的换行。

可能的原因:你提交的html代码,或许你引入了框架、或者你粘贴了别人博客的代码,而这些框架/别人博客的代码,是别人在Windows平台完成的,代码中自然是使用CRLF方式的换行,你copy到你的工程里面,编辑器并不会自动给你转化成你目标平台(Mac/linux)的换行方式。

ps:可以使用 dos2unix 转换工具来完成,Windows 上 Git bash 客户端自带了该工具,手动将文件的换行符转化为 LF。

  • 类似的,在windows下提交提交html代码,报出
    warning: LF will be replaced by CRLF

是因为,你提交的代码里面包含LF方式的换行,需要转化为windows平台的CRLF换行。

可能的原因:你提交的html代码,或许你引入了框架、或者你粘贴了别人博客的代码,而这些框架/别人博客的代码,是别人在Mac/linux平台完成的,代码中自然是使用LF方式的换行,你copy到你的工程里面,编辑器并不会自动给你转化成你目标平台(Windows)的换行方式。

Git 在设计时就考虑了这一点,其提供了一个 autocrlf的配置项,用于在提交和检出时自动转换换行符,该配置有三个可选项:

  • true: 提交时转换为 LF,检出时转换为 CRLF
  • false: 提交检出均不转换
  • input: 提交时转换为LF,检出时不转换



初次遇到这个问题,当然网上也有最简单的解决方式
git config --global core.autocrlf false #提交和检出代码都不转化
不转化意味着,你使用的目标平台有一套换行方式,引入的别人的代码一套方式,这两种方式混合并存且不转化,那以后这份代码在任何平台上检出/提交 都会有问题,因为它的换行方式总是一部分和使用的平台相符,一部分不相符。

因此不推荐使用这种方式,除非你这次提交的东西,以后几乎不会用到/改动,只用于以后浏览。

要是以后会用到,如何处理才好呢?

一句话,还是和具体使用的平台相关。

  • false表示取消自动转换功能。适合纯Windows
  • true表示提交代码时把CRLF转换成LF,签出时LF转换成CRLF。适合多平台协作
  • input表示提交时把CRLF转换成LF,检出时不转换。适合纯Linux或Mac

1、如果这些代码,只在一种平台上使用,跟具体平台相关,那只需要把你引入的 别人代码的换行方式,换成你使用平台的方式即可。转化后,在以后提交和检出代码都不会出问题。

2、如果跨平台协作,
例如:A使用Mac/Linux,B使用Windows;

现在B获取A的代码,B需要在自己的机器上设置 git config --global core.autocrlf true
B检出代码时,转化成自己Windows方式的CRLF,提交时转化为LF,和A保持一致。

还有,最好不要设置safecrlf为false,即允许两种方式并存。

推荐阅读更多精彩内容